Clojure:如何用管道执行shell命令?

时间:2016-04-20 09:58:48

标签: clojure terminal

我发现(use '[clojure.java.shell :only [sh]])用于使用clojure执行shell命令。现在,虽然(sh "ls" "-a")完成了这项工作,但(sh "ls" "-a" "| grep" "Doc")并没有。这个诀窍是什么?

1 个答案:

答案 0 :(得分:15)

clojure.java.shell/sh使用指定的参数执行命令(传递给sh函数的第一个参数)(其余参数传递给sh)。

执行时:

(sh "ls" "-a" "| grep" "Doc")

您要求使用参数ls-a| grep执行Doc

当您在终端中键入ls -a | grep Doc时,shell会将其解释为执行ls,将其std输出并将其作为std传递给另一个应该是的进程(grep)由shell开始。

您可以通过将ls作为一个进程启动来模拟shell正在执行的操作,获取其std输出,然后执行grep传递来自ls的输出作为其输入。

更简单的解决方案是让shell进程执行所有操作,就像在终端中输入一样:

(sh "bash" "-c" "ls -a | grep Doc")

-cls ...作为单独的参数传递非常重要,因此bash将它们作为单独的参数进行传递。您还需要将要执行的整个命令作为一个字符串(ls -a | grep Doc)执行。否则,只有-c之后的第一个参数将被视为命令。例如,这不会做你想做的事情:

(sh "bash" "-c" "ls -a" "|" "grep Doc")