2010-10-13 75 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

相關問題