我发现(use '[clojure.java.shell :only [sh]])
用于使用clojure执行shell命令。现在,虽然(sh "ls" "-a")
完成了这项工作,但(sh "ls" "-a" "| grep" "Doc")
并没有。这个诀窍是什么?
答案 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")
将-c
和ls ...
作为单独的参数传递非常重要,因此bash将它们作为单独的参数进行传递。您还需要将要执行的整个命令作为一个字符串(ls -a | grep Doc
)执行。否则,只有-c
之后的第一个参数将被视为命令。例如,这不会做你想做的事情:
(sh "bash" "-c" "ls -a" "|" "grep Doc")