What can I call a subprocess in Idris?

Is there any module in the standard Idris library (or a third-party library) that allows you to bypass another program? I think of modules like Python subprocessand Haskell System.Process.

Ideally, I would like to interact programmatically with the process (writing it to stdin, reading from its stdout, etc.).

+4
source share
1 answer

There is a function system : String -> IO Intthat takes a shell command, runs it, and returns an exit code. You will need import Systemto use it:

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

On my system, the above code leads to the following output:

HelloWorld!
Exit code: 0
HelloWorld!
Exit code: 256

, 1 256. , echo $?.


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, stdin/stdout . C, popen/pclose, Idris. , , , stdout (, ):

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

Source: https://habr.com/ru/post/1656479/


All Articles