2017-04-22 4 views
0

HaskellのreadProcessは、コマンド名とその引数を別々に受け取ります。私はそれをシェルに正確にタイプしたので、コマンドを実行したいと思います。 "ls -la"主な問題は、パイプなどでコマンドをどのように実行するのか分かりませんので、完全なコマンドを与えることによってreadProcessを実行します。

./someprogram -s 2> /dev/stdin | grep string 

と思われます。例外をスローするので、単にコマンド名に渡すことはできません。それでどうすればいい?

+1

System.Process.callCommand – amalloy

+1

@amalloy)(読み)のPythonから知られている機能です。それはそこに問題なしで働いた... – Lazersmoke

答えて

3

これらは、OSまたはプロセスライブラリが一般的に提供できる機能ではありません。それらは、シェル言語の機能です(使用する言語はsh/dash/bash/zshなど)。もちろん

Prelude System.Process> readProcess "bash" ["-c", "lsusb | grep 'Real'"] "" 
"Bus 001 Device 003: ID 0bda:57b5 Realtek Semiconductor Corp. \n" 

を、これはWindowsのように、bashがインストールされていないシステム上では動作しません。したがって、あなたは、引数としてコマンド全体で、プロセスとしてシェルを呼び出す必要があります。

より良い方法は、でなく、はシェルパイプを呼び出し、grepを呼び出しますが、Haskell自体で検索します。 turtleライブラリは、これは簡単です:。

Prelude Turtle> :set -XOverloadedStrings 
Prelude Turtle> stdout . grep (has "Real") $ inproc "lsusb" [] empty 
Bus 001 Device 003: ID 0bda:57b5 Realtek Semiconductor Corp. 
+0

私の目的は、(os.popen到達することだったコマンドの標準出力を返しません – Ikciwor

関連する問題