使用Clojure Java Shell输入shell命令的标准是什么,特别是cd?

时间:2014-04-22 17:28:19

标签: clojure

我一直在尝试使用Clojure Java Shell进入cd /home/ics/icsdev。我一直在收到错误,但不知道为什么。我已经阅读了源代码并查找了示例。

ics-db.core=> (sh "cmd" "cd /home/ics/icsdev")

    IOException error=2, 
 No such file or directory  
 java.lang.UNIXProcess.forkAndExec (UNIXProcess.java:-2)

我也玩过:in,并得到了这个:

ics-db.core=> (:in "cd /home/ics/icsdev" (sh "pwd" ))
{:exit 0, :out "/home/ics/projects/clojure/ics-db\n", :err ""}

我希望pwd返回/ home / ics / icsdev。

相比之下,pwd工作得很好

ics-db.core=> (sh "pwd")
{:exit 0, :out "/home/ics/projects/clojure/ics-db\n", :err ""}
ics-db.core=> 

我错过了什么?

莱恩的版本 Leiningen 2.3.4 on Java 1.7.0_55 OpenJDK Client VM Clojure 1.5.1

2 个答案:

答案 0 :(得分:3)

在(bash)提示

$ which pwd
/usr/bin/pwd

$ which cd
which: no cd in $PATH

您不能直接执行像cd这样的内置bash作为新进程。它是一个shell命令,而不是可执行文件。这就是为什么(sh "pwd")有效但(sh "cd" ...)没有用的原因。

你可以间接地这样做(Clojure REPL提示)

=> (require '[clojure.java.shell :as shell])
=> (shell/sh "sh" "-c" "cd /etc; pwd")
{:exit 0, :out "/etc\n", :err ""}

但是,这只是设置现在已退出的新shell子进程中的目录。

如果要在不同的目录中执行(多个)处理,请使用:dir指令或with-sh-dir

答案 1 :(得分:1)

cdcmd提示中的内置内容。所以,你不能以这种方式执行它,即使你可以,也没关系,因为它会改变子进程的当前工作目录,而不是产生子进程的JVM。