2010-10-13 4 views
11

Ce que je cherche est ce genre d'interaction en ligne de commande à la ligne de commande Windows:Comment changer de répertoire en ligne de commande avec Clojure?

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

Où some_script.clj contient quelque chose comme:

(cd "c:\\temp2") 

La question est - comment faire Je implémente la fonction cd? J'ai expérimenté avec clojure.java.shell, mais ça ne ressemble pas à la lib dont j'ai besoin. Cela pourrait être une question simple, le problème pourrait être que je ne parle pas couramment Java ?!

+0

'clj some_script.clj' est exécuté dans un autre processus, donc il ne peut pas changer le répertoire courant de la session du terminal. Vous ne pouvez pas faire ce que vous voulez, quelle que soit la langue. – bfontaine

+0

Vous pouvez cependant le faire avec un script shell. Et je suis sûr qu'il doit y avoir un moyen de pirater le processus parent et de changer le répertoire actuel d'un autre processus en quelque sorte, mais je suppose que ce n'est pas facile/pratique. –

+0

Vous pouvez le faire si vous * chargez * le script shell dans la session en cours; exécuter simplement le script ne fonctionnera pas. – bfontaine

Répondre

14

Vous ne pouvez pas faire cela en Java, vous ne pouvez donc pas le faire dans Clojure. Voir Changing the current working directory in Java?

+3

C'est vraiment difficile à croire. Il y a toujours un moyen, n'est-ce pas? Hmm, peut-être que je finirai avec une solution polyglotte, passant de clojure à ruby ​​pour le changement de répertoire ... :) –

+2

Il est également difficile de croire que le classpath est fixé à l'exécution, mais c'est vrai. Hotspot est un mélange bizarre de prouesses techniques étonnantes et d'erreurs osseuses. – technomancy

+0

Les répertoires de travail sont une fonctionnalité très spécifique à la plate-forme. Je pense en fait que c'est une très bonne décision de conception pour un langage indépendant de la plate-forme comme Java pour éviter d'être lié à la sémantique spécifique à la plate-forme, surtout quand il y a beaucoup d'autres façons d'obtenir le même résultat. Je suis sûr que si vous êtes vraiment déterminé, vous pouvez résoudre le problème d'une manière spécifique à la plate-forme en utilisant JNI. – mikera

2

clojure peut le faire. Vous avez seulement besoin de changer une variable globale dynamique appelée *sh-dir*. exécutez le code suivant dans votre 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 ""} 

consultez le document pour plus d'informations. vous pouvez utiliser (alter-var-root #'clojure.java.shell/*sh-dir* (constantly "the-cd-path")) pour le changer constamment. Merci pour isaac qui m'en parle. J'espère que cela aide.

+0

Bien qu'intéressant je ne suis pas sûr que vous résolviez réellement le problème indiqué dans la question. Au moins, vous ne le démontrez pas. –

+0

Je ne peux pas le démontrer plus clairement. –

+0

Vous n'avez pas démontré que le répertoire en cours a changé dans la session de terminal où votre programme s'est exécuté - que la modification a persisté après la fermeture du programme - ce que j'ai demandé. –

Questions connexes