2017-10-30 2 views
7

हम इस प्रकार System.Process.proc की मदद से एक ऐसी प्रक्रिया है foo चला सकते हैं बिना मौजूद है:प्रोग्राम की जाँच करता है, तो निष्पादन इसे चलाने या `का उपयोग कर which`

createProcess $ proc "foo" [] 

लेकिन हम समय से आगे है कि क्या foo पाया जा सकता है पता नहीं है। हम इसे चला सकते हैं और अपवाद पकड़ सकते हैं लेकिन यह खराब है। हम पहले which पर भी कॉल कर सकते थे लेकिन यह भी बेकार है। process पुस्तकालय में हम RawCommand लगता है जो आज के रूप में कहते हैं

FilePath तर्क नाम निष्पादन, और निष्पादनयोग्य के लिए खोज के लिए मंच के मानक नीति के अनुसार व्याख्या की है। विशेष रूप से:

  • यूनिक्स प्रणालियों execvp (3) अर्थ विज्ञान प्रयोग किया जाता है, जहां अगर निष्पादन योग्य फ़ाइल नाम एक स्लैश (/) तो पथ वातावरण चर निष्पादन योग्य के लिए खोज की है शामिल नहीं है पर।

  • विंडोज सिस्टम पर Win32 CreateProcess semantics का उपयोग किया जाता है। संक्षेप में: यदि फ़ाइल नाम में कोई पथ नहीं है, तो मूल निष्पादन योग्य युक्त निर्देशिका को वर्तमान निर्देशिका के बाद खोजा जाता है, उसके बाद मानक स्थान, और अंत में वर्तमान पथ। एक .exe एक्सटेंशन जोड़ा गया है यदि फ़ाइल नाम में पहले से कोई एक्सटेंशन नहीं है। पूर्ण विवरण के लिए Windows SearchPath API के लिए दस्तावेज़ देखें।

यह ठीक है मैं क्या करना चाहते हैं लेकिन वहाँ है कि यह करता है कोई भी उजागर कार्यक्षमता हो प्रतीत नहीं होता है क्या। क्या मैं इसे अभी याद कर रहा हूं, क्या कोई और वैधानिक/बेहतर तरीका है या क्या मुझे process आंतरिक के माध्यम से खोदना है? समाधान पोर्टेबल (विंडोज/लिनक्स) होना चाहिए।

+3

अपने प्रश्न में बोली स्पष्ट रूप से के रूप में, वांछित अर्थ विज्ञान ओएस द्वारा लागू किया जाता है, तो आप इसे सीधे उपयोग करना चाहते हैं, तो आप FFI उपयोग करने के लिए (और की आवश्यकता होगी फिर से लिखें सभी क्रॉस प्लेटफॉर्म संगतता कोड स्वयं)। "हम इसे चला सकते हैं और अपवाद पकड़ सकते हैं लेकिन यह गरीब है" - इस दृष्टिकोण के साथ कुछ भी गलत नहीं है, और यह अब तक का सबसे सरल लगता है। (यदि आप अपने कार्यक्रम को मजबूत बनाना चाहते हैं तो आपको शायद बाहरी कार्यक्रमों से अपवादों को संभालना चाहिए)। – user2407038

+10

यदि इरादा इसे चलाने के लिए है, तो मुझे लगता है कि इसे चलाने और अपवाद को पकड़ने का प्रयास * आदर्श * समाधान है - आपको उस मामले को संभालना होगा, भले ही अस्तित्व की जांच और निष्पादन के बीच राज्य का जोखिम बदल रहा हो । – ryachza

+1

क्या आपने [shake: command] (https://hackage.haskell.org/package/shake-0.16/docs/Development-Shake-Command.html) पर एक नज़र डाली है? मैं इसे अधिकतर शैल स्क्रिप्ट्स के विकल्प के रूप में उपयोग करता हूं – epsilonhalbe

उत्तर

2

ऐसा लगता है कि आप here से फ़ंक्शन चाहते हैं।

Prelude System.Directory> findExecutable "gcc" 
Just "/usr/bin/gcc" 
संबंधित मुद्दे