我一直在尝试使用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
答案 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)
cd
是cmd
提示中的内置内容。所以,你不能以这种方式执行它,即使你可以,也没关系,因为它会改变子进程的当前工作目录,而不是产生子进程的JVM。