Haskellでシステムコマンドを実行する方法とは結果(つまり標準出力)を変数にバインドしますか?擬似雑貨では、私は次のようなものを探しています:システムコマンドの結果をHaskellの変数にバインドする
import System.Process
main = do output <- callCommand "echo hi"
putStrLn output -- result: "hi"
これは動作しません。それと似たものがありますか?ここで
Haskellでシステムコマンドを実行する方法とは結果(つまり標準出力)を変数にバインドしますか?擬似雑貨では、私は次のようなものを探しています:システムコマンドの結果をHaskellの変数にバインドする
import System.Process
main = do output <- callCommand "echo hi"
putStrLn output -- result: "hi"
これは動作しません。それと似たものがありますか?ここで
は、いくつかの作業コードです:カーステン・ノートとして
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の答えに拡大
備考:System.IOを使用する場合は、 'stdout'、' stderr'または 'stdin'という名前を使用しないでください'同じコンテキストで、' System.IO'はこれらの名前を標準ストリームに 'Handle 'としてエクスポートします。 – Zeta
@Zeta有効なポイント、私は下塗りされたバージョンに変更しました.... – jamshidh
@jamshidh:私は別の投稿でこの答えにフォローアップの質問をしました:http://stackoverflow.com/questions/37197388/binding-the -rescent-output-of-a-variable-in-haskellを実行しています – George
、代わりにString
としてstdoutとstderrを取得するあなたはByteString
やText
としてそれらを取得したい場合、あなたは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)
使用を[ 'readProcess'](https://hackage.haskell.org/package/process- 1.4.2.0/docs/System-Process.html#v:readProcess) – Carsten