Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Command line 如何使用Clojure更改命令行中的目录?_Command Line_Clojure - Fatal编程技术网

Command line 如何使用Clojure更改命令行中的目录?

Command line 如何使用Clojure更改命令行中的目录?,command-line,clojure,Command Line,Clojure,我想要的是Windows命令行上的这种命令行交互: C:\temp1>clj some_script.clj C:\temp2> 其中某些_script.clj包含以下内容: (cd "c:\\temp2") 所以问题是-我如何实现函数cd?我已经尝试过clojure.java.shell,但它看起来不像我需要的库。这可能是一个简单的问题,问题可能是我对Java不熟练 在Java中不能这样做,所以在Clojure中也不能这样做。请参见clojure可以做到这一点。 您只需要更改名

我想要的是Windows命令行上的这种命令行交互:

C:\temp1>clj some_script.clj
C:\temp2>
其中某些_script.clj包含以下内容:

(cd "c:\\temp2")

所以问题是-我如何实现函数cd?我已经尝试过clojure.java.shell,但它看起来不像我需要的库。这可能是一个简单的问题,问题可能是我对Java不熟练

在Java中不能这样做,所以在Clojure中也不能这样做。请参见

clojure可以做到这一点。 您只需要更改名为
*sh dir*
的动态全局变量。在repl中运行以下代码:

 (use '[clojure.java.sh])
 (sh "ls")
    => {:exit 0, :out "LICENSE\nREADME.md\nauto_deploy.iml\ndoc\nproject.clj\nresources\nsrc\ntarget\ntest\n", :err ""}

    (binding [*sh-dir* "c:/"] (sh "ls"))
{:exit 0,
 :out "$360Section
       $GetCurrent
       $Recycle.Bin
       Boot
       Documents and Settings
       ImbaMallLog.txt
       Intel
       MSOCache
       OEMSY
       PerfLogs
       Program Files
       Program Files (x86)
       ProgramData
       Python27
       Recovery
       System Volume Information
       Users
       Windows
       apache-ant-1.9.3
       bootmgr
       hiberfil.sys
       inetpub
       pagefile.sys
       ",
 :err ""}
有关更多信息,请参阅文档。您可以使用
(alter var root#'clojure.java.shell/*sh dir*(经常使用“cd路径”)
来经常更改它。谢谢艾萨克告诉我这件事。
希望这能有所帮助。

这真是难以置信。总有办法的,不是吗?嗯,也许我最终会得到一个多语言的解决方案,从clojure到ruby进行目录更改…:)很难相信类路径在运行时是固定的,但这是真的。Hotspot是惊人的工程能力和愚蠢的错误的奇怪组合。工作目录是一个非常特定于平台的功能。事实上,我认为对于像Java这样的独立于平台的语言来说,避免与特定于平台的语义绑定是一个非常好的设计决策,特别是当有很多其他方法可以实现相同的结果时。我相信如果你真的下定决心,你可以用JNI以特定于平台的方式解决这个问题。虽然很有趣,但我不确定你是否真的解决了问题中提到的问题。至少你没有演示它。你没有演示当前目录在你的程序运行的终端会话中发生了更改-在程序退出后更改仍然存在-这就是我所要求的。
clj some_script.clj
是在另一个进程中执行的,因此它无法更改终端会话的当前目录。你不能做你想做的事,不管是什么语言。但是你可以用shell脚本来做。我相信一定有办法侵入父进程并以某种方式从另一进程更改当前目录,但我想这并不容易/实用。如果在当前会话中*加载*shell脚本,就可以这样做;仅仅执行脚本是行不通的。如果我们仍然在谈论windows命令行(批处理脚本),那么它就行了。在香草bash中不是这样的;我读得太快了,没有发现这是一个Windows特有的问题。