通过给出完整命令来执行readProcess

时间:2017-04-22 21:39:42

标签: haskell command-line-interface

Haskell中的

readProcess分别获取命令名称及其args。我想执行命令,因为我已将其完全键入shell,例如。 “ls -la”。主要的问题是我不知道如何用一些管道等执行命令,所以

./someprogram -s 2> /dev/stdin | grep string

似乎不可能。我不能简单地将它传递给命令名,因为它会抛出异常。那我该怎么办呢?

1 个答案:

答案 0 :(得分:3)

这些不是您通常可以期望操作系统或流程库为您提供的功能。它们是 shell 语言的功能(即sh / dash / bash / zsh等,无论您使用什么)。因此,您必须将shell作为进程调用,并将整个命令作为参数:

Prelude System.Process> readProcess "bash" ["-c", "lsusb | grep 'Real'"] ""
"Bus 001 Device 003: ID 0bda:57b5 Realtek Semiconductor Corp. \n"

当然,这不适用于没有安装Bash的系统,例如Windows。

更好的方法是调用任何shell管道和grep,但在Haskell本身进行搜索。 turtle库使这一切变得简单:

Prelude Turtle> :set -XOverloadedStrings
Prelude Turtle> stdout . grep (has "Real") $ inproc "lsusb" [] empty
Bus 001 Device 003: ID 0bda:57b5 Realtek Semiconductor Corp.