2016-10-01 6 views
4

Idrisの標準ライブラリ(またはサードパーティのライブラリ)に、別のプログラムにシェルするためのモジュールがありますか?私はPythonのsubprocessとHaskellのSystem.Processのようなモジュールについて考えています。Idrisでどのようにサブプロセスを呼び出すことができますか?

理想的には、私はプロセス(プログラムのstdinへの書き込み、stdoutからの読み込みなど)とプログラム的にやり取りしたいと思います。

+0

シェルコマンドを受け取り、その終了コードを返す 'system:String - > IO Int'関数があります。それを使用するには、 'Import System'が必要です。 –

+0

@AntonTrunov私に賞金のある価値のある答えのように聞こえる –

+0

@BenjaminHodgsonありがとう。それを答えに広げた。 –

答えて

2

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 
+0

サブプロセスのstdin/outストリームに物事をパイプするための 'system'の変形がありますか? –

+0

私はstdoutをキャプチャする方法の例で答えを更新しました。 'system'はCの' system() '関数の単なるラッパーであるため、それと対話することは実現不可能です。 –

+1

偉大な答え。 Idrisは、このようなドキュメントをもっと手に入れる必要があります。バウンティは喜んで与えられました! –

関連する問題