【问题标题】:Pipe output to getArgs in Haskell管道输出到 Haskell 中的 getArgs
【发布时间】:2018-06-24 15:48:10
【问题描述】:

今天我试图制作一个程序,其中文件的内容将被读取为 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”不适用于管道的原因??

谢谢

【问题讨论】:

  • 管道到标准输入。
  • 你的程序没什么特别的; echo example 打印 example;但echo example | echo 什么也不打印。

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


【解决方案1】:

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

【讨论】:

  • 你是完全正确的,我尝试使用 getContents 并且它有效。谢谢!!
【解决方案2】:

如果您希望传递给第二个进程的内容 作为参数而不是标准输入,您可以像这样使用xargs

echo example | xargs runhaskell Main.hs 

【讨论】:

  • 这是我一直在寻找的正确解决方案,连同 4casle 建议的解决方案,我将相应地更新代码。谢谢@gallais
猜你喜欢
  • 1970-01-01
  • 2015-11-16
  • 2020-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多