管道输出到Haskell中的getArgs

时间:2018-01-16 00:57:32

标签: bash haskell functional-programming command-line-arguments

今天我正在尝试创建一个程序,其中文件中的内容将被读取为Haskell程序的输入,如下所示:

module Main where

import System.Posix.Env.ByteString (getArgs)

main :: IO ()
main = do
  info <- getArgs
  print info

如果我直接发送(字节)字符串,它会起作用:

> runhaskell Main.hs example
  ["example"]

但是,如果我尝试将一个命令的输出“管道”到该程序,我得到一个空响应,如下所示:

> echo example | runhaskell Main.hs 
  []

即使我编译程序,使用字符串版本的getArgs,使用特殊的bash变量标记,如$!或者一样的。我找到的唯一方法是这样做:

> runhaskell Main.hs $(echo example)
  ["example"]

这不是意图和“管道”几个命令使它有点烦人。

是否有人有改进版本或“getArgs”无法使用管道的原因??

由于

2 个答案:

答案 0 :(得分:2)

管道通过将一个命令的标准输出设置为另一个命令的标准输入来工作。它没有对论点做任何事情。如果您想要将所有标准输入检索为ByteString,请使用Data.ByteString中的getContents

答案 1 :(得分:2)

如果您希望传递给第二个流程的内容 作为参数而不是stdin,您可以像xargs那样使用:

echo example | xargs runhaskell Main.hs