haskell中IO句柄的多行内容不显示任何内容

haskell中IO句柄的多行内容不显示任何内容,haskell,io,createprocess,Haskell,Io,Createprocess,我一直在用哈斯克尔做实验。我正在尝试编写一个web爬虫程序,由于一些代理设置,我需要使用外部curl二进制文件,curl需要一些特殊参数,这些参数在haskell代码中似乎不可能/很难设置,因此我宁愿将其作为命令行选项传递。但那是另一个故事 在底部的代码中,如果我使用curl而不是curl更改标记行,则帮助正确渲染输出并给出: "curl: try 'curl --help' or 'curl --manual' for more information " 否则字符串是

我一直在用哈斯克尔做实验。我正在尝试编写一个web爬虫程序,由于一些代理设置,我需要使用外部curl二进制文件,curl需要一些特殊参数,这些参数在haskell代码中似乎不可能/很难设置,因此我宁愿将其作为命令行选项传递。但那是另一个故事

在底部的代码中,如果我使用curl而不是curl更改标记行,则帮助正确渲染输出并给出:

"curl: try 'curl --help' or 'curl --manual' for more information
" 
否则字符串是空的,因为“curl-help”响应是多行的。 我怀疑在haskell中,每一行新代码都会清除缓冲区。其他简单的shell命令也一样,比如ls与ls-l等

我怎么修理它

守则:
如果要将参数传递给curl,则必须在列表中传递参数:

sp = (proc "/usr/bin/curl" ["--help"]) {std_out=CreatePipe}
然后您将获得整个字符串的完整输出。

proc将可执行文件的名称作为第一个参数,而不是shell命令。也就是说,当您使用proc-foo-bar时,您指的不是一个foo可执行文件,而是一个名为foo-bar的可执行文件,文件名中有空格

这在实践中是一个有用的功能,因为有时您确实在其中有空格,例如在Windows上,您可能有c:\Program Files\Foo\Foo.exe。使用shell命令时,必须在命令字符串中转义空格。更糟糕的是,还有一些其他字符需要转义,而且检查这些字符的确切含义很麻烦。proc完全不使用shell,而是将字符串原样传递给操作系统,从而避免了这个问题

对于可执行参数,proc采用单独的参数列表。例如

proc "c:\\Program Files\\Foo\\Foo.exe" ["hello world!%$"]
请注意,参数也不需要转义

proc "c:\\Program Files\\Foo\\Foo.exe" ["hello world!%$"]