Bash 管道输出到Haskell中的getArgs

Bash 管道输出到Haskell中的getArgs,bash,haskell,functional-programming,command-line-arguments,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"] > runhaskell Main.hs $(echo examp

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

module Main where

import System.Posix.Env.ByteString (getArgs)

main :: IO ()
main = do
  info <- getArgs
  print info
> runhaskell Main.hs example
  ["example"]
> runhaskell Main.hs $(echo example)
  ["example"]
但是,如果我尝试将一个命令的输出“管道化”到此程序,我会得到一个空响应,如下所示:

> echo example | runhaskell Main.hs 
  []
即使我编译了这个程序,也要使用字符串版本的getArgs,用特殊的bash变量标记,比如$!或者类似的。我发现的唯一方法是这样做:

module Main where

import System.Posix.Env.ByteString (getArgs)

main :: IO ()
main = do
  info <- getArgs
  print info
> runhaskell Main.hs example
  ["example"]
> runhaskell Main.hs $(echo example)
  ["example"]
这不是我们的初衷,“管道”几个命令让它有点烦人

是否有人有改进的版本或“getArgs”不能使用管道的原因


多谢

管道通过将一个命令的标准输出设置为另一个命令的标准输入来工作。它与参数无关。如果要以
ByteString
的形式检索所有标准输入,请使用from
Data.ByteString

将要传送到第二个进程的内容 作为参数而不是stdin,您可以使用
xargs
如下所示:

echo example | xargs runhaskell Main.hs 

将管道连接到stdin。您的程序没有什么特别之处<代码>回显示例
打印
示例
;但是
echo示例| echo
没有打印任何内容。你完全正确,我尝试使用
getContents
并成功了。谢谢这是我一直在寻找的正确解决方案,连同4casle提出的解决方案,我将相应地更新代码。谢谢@gallais