2016-05-09 2 views
5

Haskellでシステムコマンドを実行する方法は結果(つまり標準出力)を変数にバインドしますか?擬似雑貨では、私は次のようなものを探しています:システムコマンドの結果をHaskellの変数にバインドする

import System.Process 

main = do output <- callCommand "echo hi" 
      putStrLn output -- result: "hi" 

これは動作しません。それと似たものがありますか?ここで

+2

使用を[ 'readProcess'](https://hackage.haskell.org/package/process- 1.4.2.0/docs/System-Process.html#v:readProcess) – Carsten

答えて

6

は、いくつかの作業コードです:カーステン・ノートとして

import System.Process 

main :: IO() 
main = do 
    let stdin' = "" 
    (errCode, stdout', stderr') <- readProcessWithExitCode "echo" ["hi"] stdin' 
    putStrLn $ "stdout: " ++ stdout' 
    putStrLn $ "stderr: " ++ stderr' 
    putStrLn $ "errCode: " ++ show errCode 

、あなたはreadProcessを使用することができますが、深刻な用法で、あなたはすぐにあなたのコマンドが黙っている理由として非常に混乱となりますので、私はこのバージョンを好みます失敗します(コマンドラインで実行している場合は、stdoutとstderrの両方が表示されています)。 jamshidhの答えに拡大

+1

備考:System.IOを使用する場合は、 'stdout'、' stderr'または 'stdin'という名前を使用しないでください'同じコンテキストで、' System.IO'はこれらの名前を標準ストリームに 'Handle 'としてエクスポートします。 – Zeta

+0

@Zeta有効なポイント、私は下塗りされたバージョンに変更しました.... – jamshidh

+0

@jamshidh:私は別の投稿でこの答えにフォローアップの質問をしました:http://stackoverflow.com/questions/37197388/binding-the -rescent-output-of-a-variable-in-haskellを実行しています – George

2

、代わりにStringとしてstdoutとstderrを取得するあなたはByteStringTextとしてそれらを取得したい場合、あなたはprocess-extrasパッケージを使用することができます。

また
$ import System.Process.Streaming 
$ execute (piped (shell "echo foo")) (liftA3 (,,) (foldOut intoLazyBytes)  
                (foldErr intoLazyBytes) 
                exitCode) 
("foo\n","",ExitSuccess) 

Text用:

あなたはまた私のprocess-streamingパッケージを使用することができます

$ import System.Process.Streaming.Text 
$ execute (piped (shell "echo foo")) (liftA3 (,,) (foldOut (transduce1 utf8x intoLazyText)) 
                (foldErr (transduce1 utf8x intoLazyText)) 
                exitCode) 
("foo\n","",ExitSuccess) 
関連する問題