【问题标题】:How do I change directory in command line with Clojure?如何使用 Clojure 在命令行中更改目录?
【发布时间】:2016-07-22 10:57:19
【问题描述】:

我正在寻找的是这种在 Windows 命令行下的命令行交互:

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

其中 some_script.clj 包含以下内容:

(cd "c:\\temp2")

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

【问题讨论】:

  • clj some_script.clj 在另一个进程中执行,因此它无法更改终端会话的当前目录。无论使用哪种语言,您都无法为所欲为。
  • 您可以使用 shell 脚本来完成。而且我确信必须有一种方法可以侵入父进程并以某种方式从另一个进程更改当前目录,但我想这并不容易/实用。
  • 如果您*在当前会话中加载* shell 脚本,您可以这样做;仅仅执行脚本是行不通的。
  • 如果我们还在谈论 Windows 命令行(批处理脚本),那么它确实有效。在香草 bash 中它没有。
  • 对;我读得太快了,没有看到这是一个特定于 Windows 的问题。

标签: command-line clojure


【解决方案1】:

在 Java 中无法做到这一点,因此在 Clojure 中也无法做到。见Changing the current working directory in Java?

【讨论】:

  • 这真是难以置信。总有办法的,不是吗?嗯,也许我最终会得到一个多语言解决方案,从 clojure 到 ruby​​ 进行目录更改...... :)
  • 很难相信类路径在运行时是固定的,但这是真的。 Hotspot 是惊人的工程能力和愚蠢的错误的奇怪组合。
  • 工作目录是一个非常特定于平台的功能。实际上,我认为对于像 Java 这样的平台无关语言来说,避免与特定于平台的语义相关联是一个非常好的设计决策,尤其是当有很多其他方法可以实现相同的结果时。我敢肯定,如果您真的有决心,您可以使用 JNI 以特定于平台的方式解决问题。
【解决方案2】:

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* (constantly "the-cd-path")) 不断更改它。感谢艾萨克告诉我这个。 希望这会有所帮助。

【讨论】:

  • 虽然很有趣,但我不确定您是否真的解决了问题中所述的问题。至少你没有展示出来。
  • 您没有证明当前目录在程序运行的终端会话中发生了变化——程序退出后变化仍然存在——这就是我的要求。
猜你喜欢
  • 2013-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-05
  • 1970-01-01
  • 2018-12-10
  • 2018-10-08
相关资源
最近更新 更多