2010-10-13 9 views
11

Quello che sto cercando è questo tipo di interazione riga di comando nella riga di comando di Windows:Come cambio directory in riga di comando con Clojure?

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

Dove some_script.clj contiene qualcosa come:

(cd "c:\\temp2") 

Quindi la domanda è - come si fa Implemento la funzione cd? Ho sperimentato con clojure.java.shell, ma non sembra la lib di cui ho bisogno. Questa potrebbe essere una semplice domanda, il problema potrebbe essere che non sono fluente in Java ?!

+0

'clj some_script.clj' viene eseguito in un altro processo in modo che non possa modificare la directory corrente della sessione del terminale. Non puoi fare quello che vuoi, qualunque sia la lingua. – bfontaine

+0

Si potrebbe tuttavia farlo con uno script di shell. E sono sicuro che ci deve essere un modo per hackerare il processo genitore e cambiare la directory corrente da un altro processo in qualche modo, ma immagino che non sia facile/pratico. –

+0

Puoi farlo se * carichi * lo script della shell nella sessione corrente; semplicemente l'esecuzione dello script non funzionerà. – bfontaine

risposta

14

Non è possibile farlo in Java, quindi non è possibile farlo in Clojure. Vedi Changing the current working directory in Java?

+3

È davvero difficile da credere. C'è sempre un modo, non c'è? Hmm, forse finirò con una soluzione poliglotta, sborsando da clojure a ruby ​​per il cambio di directory ... :) –

+2

È anche difficile credere che il classpath sia corretto in fase di runtime, ma è vero. L'hotspot è un bizzarro mix di sorprendenti abilità ingegneristiche e errori ossessionati. – technomancy

+0

Le directory di lavoro sono una funzionalità molto specifica della piattaforma. In realtà penso che sia una buona decisione progettuale per un linguaggio indipendente dalla piattaforma come Java per evitare di essere legato alla semantica della piattaforma specifica, specialmente quando ci sono molti altri modi per ottenere lo stesso risultato. Sono sicuro che se sei veramente determinato, potresti risolvere il problema in un modo specifico della piattaforma usando JNI. – mikera

2

clojure può farlo. È sufficiente modificare una variabile globale dinamica denominata *sh-dir*. eseguire il seguente codice nel tuo 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 ""} 

vedere il doc per maggiori informazioni. puoi usare (alter-var-root #'clojure.java.shell/*sh-dir* (constantly "the-cd-path")) per cambiarlo costantemente. Grazie per isaac che mi ha parlato di questo. Spero che questo aiuti.

+0

Mentre sono interessante non sono sicuro che in realtà risolvi il problema indicato nella domanda. Almeno non lo dimostri. –

+0

Non posso dimostrarlo più chiaro. –

+0

Non hai dimostrato che la directory corrente è cambiata nella sessione del terminale in cui è stato eseguito il tuo programma - che la modifica è persistita dopo l'uscita dal programma - che era quello che ho chiesto. –

Problemi correlati