我正在寻找的是这样的命令行交互的在Windows命令行:如何在Clojure的命令行中更改目录?
C:\temp1>clj some_script.clj
C:\temp2>
凡some_script.clj包含类似:
(cd "c:\\temp2")
所以,问题是 - 怎么办我实现了函数cd?已经尝试了clojure.java.shell,但它看起来不像我需要的库。这可能是一个简单的问题,问题可能是我不熟练使用Java?
我正在寻找的是这样的命令行交互的在Windows命令行:如何在Clojure的命令行中更改目录?
C:\temp1>clj some_script.clj
C:\temp2>
凡some_script.clj包含类似:
(cd "c:\\temp2")
所以,问题是 - 怎么办我实现了函数cd?已经尝试了clojure.java.shell,但它看起来不像我需要的库。这可能是一个简单的问题,问题可能是我不熟练使用Java?
你不能在Java中这样做,所以你不能在Clojure中做到这一点。见Changing the current working directory in Java?
这真的很难相信。总有办法,不是吗?嗯,也许我会得到一个polyglot解决方案,从clojure脱壳到ruby目录更改... :) – 2010-10-13 08:23:50
也很难相信classpath在运行时是固定的,但它是真的。热点是惊人的工程实力和骨头错误的奇异组合。 – technomancy 2010-10-13 17:02:04
工作目录是一个非常特定于平台的功能。实际上,我认为对于像Java这样的平台独立语言来说,这是一个非常好的设计决策,以避免与特定于平台的语义相关联,特别是当有很多其他方法可以实现相同的结果时。我确信如果你真的确定下来,你可以使用JNI以平台特定的方式解决问题。 – mikera 2010-10-14 00:00:28
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"))
来不断改变它。谢谢艾萨克告诉我这件事。 希望这有助于。
虽然有趣,但我不确定你是否真的解决了问题中提到的问题。至少你没有证明它。 – 2016-08-08 08:48:44
我不能更清楚地阐述它。 – 2016-08-10 13:36:05
您没有证明当前目录在程序运行的终端会话中发生了变化 - 程序退出后更改仍然存在 - 这就是我所要求的。 – 2016-09-27 13:59:33
'clj some_script.clj'在另一个进程中执行,因此它不能更改终端会话的当前目录。不管语言如何,你都无法做到你想要的。 – bfontaine 2017-08-08 08:37:10
但是,您可以使用shell脚本执行此操作。我相信必须有办法破解父进程,并以某种方式从另一个进程中更改当前目录,但我认为这并不容易/实用。 – 2017-08-09 12:36:45
如果在当前会话中加载* shell脚本,则可以这样做;仅执行该脚本将不起作用。 – bfontaine 2017-08-09 12:38:43