2010-10-13 76 views
11

我正在寻找的是这样的命令行交互的在Windows命令行:如何在Clojure的命令行中更改目录?

C:\temp1>clj some_script.clj 
C:\temp2> 

凡some_script.clj包含类似:

(cd "c:\\temp2") 

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

+0

'clj some_script.clj'在另一个进程中执行,因此它不能更改终端会话的当前目录。不管语言如何,你都无法做到你想要的。 – bfontaine 2017-08-08 08:37:10

+0

但是,您可以使用shell脚本执行此操作。我相信必须有办法破解父进程,并以某种方式从另一个进程中更改当前目录,但我认为这并不容易/实用。 – 2017-08-09 12:36:45

+0

如果在当前会话中加载* shell脚本,则可以这样做;仅执行该脚本将不起作用。 – bfontaine 2017-08-09 12:38:43

回答

14

你不能在Java中这样做,所以你不能在Clojure中做到这一点。见Changing the current working directory in Java?

+3

这真的很难相信。总有办法,不是吗?嗯,也许我会得到一个polyglot解决方案,从clojure脱壳到ruby目录更改... :) – 2010-10-13 08:23:50

+2

也很难相信classpath在运行时是固定的,但它是真的。热点是惊人的工程实力和骨头错误的奇异组合。 – technomancy 2010-10-13 17:02:04

+0

工作目录是一个非常特定于平台的功能。实际上,我认为对于像Java这样的平台独立语言来说,这是一个非常好的设计决策,以避免与特定于平台的语义相关联,特别是当有很多其他方法可以实现相同的结果时。我确信如果你真的确定下来,你可以使用JNI以平台特定的方式解决问题。 – mikera 2010-10-14 00:00:28

2

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

(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* (constantly "the-cd-path"))来不断改变它。谢谢艾萨克告诉我这件事。 希望这有助于。

+0

虽然有趣,但我不确定你是否真的解决了问题中提到的问题。至少你没有证明它。 – 2016-08-08 08:48:44

+0

我不能更清楚地阐述它。 – 2016-08-10 13:36:05

+0

您没有证明当前目录在程序运行的终端会话中发生了变化 - 程序退出后更改仍然存在 - 这就是我所要求的。 – 2016-09-27 13:59:33

相关问题