2016-08-21 8 views
0

フォローアップHow to use readProcessWithExitCode?readProcessWithExitCodeの使い方は? (パート2)

次の端末のコマンドが正常に動作します:

$ grep "run" ./*.hs 

それは、現在のディレクトリ内の文字列「runr」を含むすべてのHSファイルを検索します。

しかし、Haskellでは、このコマンドは(いくつかの一致するファイルが存在する場合であっても)終了コードを返します。

Prelude System.Process> readProcessWithExitCode "grep" ["run", "./*.hs"] "" 

それでは、どのようreadProcessWithExitCode(またはreadProcess)がない正確に、引数のリストに対処しますか?

答えて

1

シェルでコマンドを実行すると、シェルは現在のディレクトリ内のすべてのファイル名に "glob" ./*.hsを末尾に.hsに展開します。

したがって、grepコマンドでは、引数./*.hsが表示されないため、実際の.hsファイル名のみが表示されます。あなたがシェルを呼び出すように構成されたのCreateProcess値でreadCreateProcessWithExitCodeを使用する必要がグロブパターン展開のためにシェルを取得するには

readCreateProcessWithExitCode (shell "grep run ./*.hs") 

はしかし、あなたがして、引数を引用し、エスケープを心配する必要があります。

readProcess "grep" ["run this", ...] "" 

はなく、最初の引数にスペースが含まれていることを心配する:あなたは がrun thisのためにgrepをしている場合たとえば、あなたはreadProcessであなただけ使用するのに対し、

readCreateProcessWithExitCode (shell "grep 'run this' ./*.hs") "" 

の周りに引用符を追加する必要があります。

あなた自身をグロブファイルを実行することができGlobパッケージを使用する:私は見

import System.FilePath.Glob 

main = do 
    files <- glob "./*.hs" 
    let args = ["run"] ++ files 
    readProcess "grep" args "" 
+0

[OK]をクリックします。私は 'glob'を知らなかった。ありがとうございました。私は 'readCreateProcess'を知っていた、これは私が使用した回避策です。 –

+0

私はちょうど補完するために、絶対パスと相対パス(globが絶対パスを返す)との間で変換するのが非常に良い[パスライブラリ](https://hackage.haskell.org/package/path)を見つけました。 –

関連する問題