2010-10-13 3 views
11

Was ich suche ist diese Art der Interaktion Befehlszeile an der Linie Windows-Befehl:Wie ändere ich das Verzeichnis in der Befehlszeile mit Clojure?

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

Wo some_script.clj etwas wie enthält:

(cd "c:\\temp2") 

Die Frage ist also - wie Ich implementiere die Funktion cd? Habe mit clojure.java.shell experimentiert, aber es sieht nicht so aus wie die lib, die ich brauche. Dies könnte eine einfache Frage sein, könnte das Problem sein, dass ich Java nicht fließend spreche ?!

+0

'clj some_script.clj' wird in einem anderen Prozess ausgeführt, so dass das aktuelle Verzeichnis der Terminalsitzung nicht geändert werden kann. Sie können nicht tun, was Sie wollen, egal in welcher Sprache. – bfontaine

+0

Sie könnten es jedoch mit einem Shell-Skript tun. Und ich bin sicher, dass es einen Weg geben muss, in den Elternprozess zu hacken und das aktuelle Verzeichnis irgendwie von einem anderen Prozess zu ändern, aber ich denke, es ist nicht einfach/praktisch. –

+0

Sie könnten es tun, wenn Sie das Shell-Skript in der aktuellen Sitzung * laden *; nur das Ausführen des Skripts funktioniert nicht. – bfontaine

Antwort

14

Sie können dies nicht in Java, so dass Sie es nicht in Clojure tun können. Siehe Changing the current working directory in Java?

+3

Das ist wirklich schwer zu glauben. Es gibt immer einen Weg, nicht wahr? Hmm, vielleicht werde ich mit einer polyglotten Lösung enden, die von clojure nach ruby ​​für den Verzeichniswechsel ausschert ... :) –

+2

Es ist auch schwer zu glauben, dass der Klassenpfad zur Laufzeit festgelegt ist, aber es ist wahr. Hotspot ist eine bizarre Mischung aus erstaunlichen Ingenieurskunst und boneheaded Fehler. – technomancy

+0

Arbeitsverzeichnisse sind eine sehr plattformspezifische Funktion. Ich denke eigentlich, dass es eine sehr gute Designentscheidung für eine plattformunabhängige Sprache wie Java ist, um zu vermeiden, an plattformspezifische Semantiken gebunden zu sein, insbesondere wenn es viele andere Möglichkeiten gibt, dasselbe Ergebnis zu erzielen. Ich bin sicher, wenn Sie wirklich entschlossen sind, könnten Sie das Problem auf plattformspezifische Weise mit JNI lösen. – mikera

2

clojure kann dies tun. Sie müssen nur eine dynamische globale Variable namens *sh-dir* ändern. Führen Sie den folgenden Code in Ihrer 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 ""} 

siehe doc für weitere Informationen. Sie können (alter-var-root #'clojure.java.shell/*sh-dir* (constantly "the-cd-path")) verwenden, um es ständig zu ändern. Danke, dass isaac mir davon erzählt hat. Hoffe, das hilft.

+0

Während ich interessant bin, bin ich mir nicht sicher, ob Sie das in der Frage angegebene Problem tatsächlich lösen. Zumindest demonstrierst du es nicht. –

+0

Ich kann es nicht klarer darstellen. –

+0

Sie haben nicht nachgewiesen, dass das aktuelle Verzeichnis in der Terminalsitzung geändert wurde, in der Ihr Programm ausgeführt wurde - dass die Änderung nach dem Beenden des Programms erhalten blieb - was ich gefragt habe. –

Verwandte Themen