2017-10-30 7 views
7

を使用せずに存在する場合は、次のように我々はSystem.Process.procの助けを借りて、プロセスfooを実行することができます確認してください。我々はそれを実行し、例外をキャッチすることができますが、それは貧しいです。我々はまたwhichに最初に呼び出すことができたが、それはまた吸う。 processライブラリーでは、今日のようは、プログラムの実行がそれを実行しているか、 `which`

ファイルパスを引数名、実行可能と言う、と 実行ファイルを検索するためのプラットフォームの標準ポリシーに従って を解釈しているRawCommand見つけます。具体的には、次の実行可能ファイル名がスラッシュ(/)が含まれていないならば、PATH 環境変数は、実行のために検索されexecvpの(3)のセマンティクスが使用されているUnixシステム上

  • 、。

  • Windowsシステム Win32 CreateProcessセマンティクスが使用されます。簡単に言えば、ファイル名 にパスが含まれていない場合、実行可能ファイルの親ディレクトリ を含むディレクトリが検索され、次に現在のディレクトリが検索され、 標準の場所、最後に現在のPATHが検索されます。ファイル名に拡張子がない場合、.exe拡張子は です。 の詳細については、Windows SearchPath APIのドキュメントを参照してください。

これは私がやりたいものを正確にですが、それをしない任意の公開されている機能があるようには思えません。私はちょうどそれを逃している、より標準的な/より良い方法があるまたは私はprocess内部を掘る必要がありますか?ソリューションはポータブルでなければなりません(Windows/Linux)。

+3

あなたの質問には、希望のセマンティクスがOSによって実装されているので、直接アクセスしたい場合は、FFIを使用してすべてのクロスプラットフォームを書き直す必要がありますあなた自身の互換性コード)。 「これを実行して例外をキャッチすることはできますが、それは貧弱です」 - このアプローチには何も問題はなく、最も単純なものと思われます。 (プログラムを堅牢にしたい場合は、とにかく外部プログラムの例外を処理する必要があります)。 – user2407038

+10

とにかく実行しようとするなら、私はそれを実行し例外をキャッチしようとすると理想的な解決策だと思う - 存在チェックと実行の間で状態が変わるリスクがあるので、 。 – ryachza

+1

[shake:command](https://hackage.haskell.org/package/shake-0.16/docs/Development-Shake-Command.html)を見たことがありますか?主にシェルスクリプトの代わりに使用します – epsilonhalbe

答えて

2

findExecutableの機能がhereのように見えます。

Prelude System.Directory> findExecutable "gcc" 
Just "/usr/bin/gcc" 
関連する問題