Idrisの標準ライブラリ(またはサードパーティのライブラリ)に、別のプログラムにシェルするためのモジュールがありますか?私はPythonのsubprocess
とHaskellのSystem.Process
のようなモジュールについて考えています。Idrisでどのようにサブプロセスを呼び出すことができますか?
理想的には、私はプロセス(プログラムのstdinへの書き込み、stdoutからの読み込みなど)とプログラム的にやり取りしたいと思います。
Idrisの標準ライブラリ(またはサードパーティのライブラリ)に、別のプログラムにシェルするためのモジュールがありますか?私はPythonのsubprocess
とHaskellのSystem.Process
のようなモジュールについて考えています。Idrisでどのようにサブプロセスを呼び出すことができますか?
理想的には、私はプロセス(プログラムのstdinへの書き込み、stdoutからの読み込みなど)とプログラム的にやり取りしたいと思います。
system : String -> IO Int
シェルコマンドを実行して実行し、終了コードを返す関数があります。あなたはそれを使用するimport System
する必要があります:私のシステムで
import System
main : IO()
main = do
exitCode <- system "echo HelloWorld!"
putStrLn $ "Exit code: " ++ show exitCode
exitCode <- system "echo HelloWorld!; false"
putStrLn $ "Exit code: " ++ show exitCode
次の出力で上記のコードの結果:
HelloWorld!
Exit code: 0
HelloWorld!
Exit code: 256
私はそれが第二中1
の代わり256
を返すことを期待したいです場合。少なくともそれはecho $?
が示すものです。
別のバージョンがthisチュートリアルで説明されてEffects
ライブラリに基づか行うことができます:ここで
import Effects
import Effect.System
import Effect.StdIO
execAndPrint : (cmd : String) -> Eff() [STDIO, SYSTEM]
execAndPrint cmd = do
exitCode <- system cmd
putStrLn $ "Exit code: " ++ show exitCode
script : Eff() [STDIO, SYSTEM]
script = do
execAndPrint "echo HelloWorld!"
execAndPrint "sh -c \"echo HelloWorld!; exit 1\""
main : IO()
main = run script
我々はそれがEffects
パッケージを必要としていることをイドリスに説明する必要があります。
idris -p effects <filename.idr>
私はIdris librサブプロセスのstdin/stdoutを使って簡単に作業できます。この問題を回避するには、popen
/pclose
関数を使用するCのパイプ機能を使用できます。これらの関数はIdris標準ライブラリにバインドされています。 (それは初歩的なエラー処理と簡単なスニペットだということを心に留めてください)私たちは、例えば、サブプロセスの標準出力から読み取ることができるかお見せしましょう:
import System
-- read the contents of a file
readFileH : (fileHandle : File) -> IO String
readFileH h = loop ""
where
loop acc = do
if !(fEOF h) then pure acc
else do
Right l <- fGetLine h | Left err => pure acc
loop (acC++ l)
execAndReadOutput : (cmd : String) -> IO String
execAndReadOutput cmd = do
Right fh <- popen cmd Read | Left err => pure ""
contents <- readFileH fh
pclose fh
pure contents
main : IO()
main = do
out <- (execAndReadOutput "echo \"Captured output\"")
putStrLn "Here is what we got:"
putStr out
あなたがプログラムを実行すると、あなたが
が表示されるはずですHere is what we got:
Captured output
サブプロセスのstdin/outストリームに物事をパイプするための 'system'の変形がありますか? –
私はstdoutをキャプチャする方法の例で答えを更新しました。 'system'はCの' system() '関数の単なるラッパーであるため、それと対話することは実現不可能です。 –
偉大な答え。 Idrisは、このようなドキュメントをもっと手に入れる必要があります。バウンティは喜んで与えられました! –
シェルコマンドを受け取り、その終了コードを返す 'system:String - > IO Int'関数があります。それを使用するには、 'Import System'が必要です。 –
@AntonTrunov私に賞金のある価値のある答えのように聞こえる –
@BenjaminHodgsonありがとう。それを答えに広げた。 –