2012-04-30 10 views
104

Ich weiß, ich kann cd Befehl verwenden, um mein Arbeitsverzeichnis in bash zu ändern.Ändern Sie vorübergehend das aktuelle Arbeitsverzeichnis in bash, um einen Befehl auszuführen

Aber wenn ich diesen Befehl ein:

cd SOME_PATH && run_some_command 

Dann wird das Arbeitsverzeichnis permanent geändert werden. Gibt es eine Möglichkeit, das Arbeitsverzeichnis nur vorübergehend so zu ändern?

PWD=SOME_PATH run_some_command 
+1

warum nicht halten Sie es einfach ** cd SOME_PATH && run_some_command && cd - ** der letzte Befehl bringt Sie zurück zur letzten PWD Verzeichnis nehmen. – Sahil

Antwort

186

Sie können durch Einschließen der Befehlszeile in einem Paar Klammern die cd und die ausführbare Datei in einer Subshell auszuführen:

(cd SOME_PATH && exec_some_command) 

Demo:

$ pwd 
/home/abhijit 
$ (cd /tmp && pwd) # directory changed in the subshell 
/tmp 
$ pwd    # parent shell's pwd is still the same 
/home/abhijit 
+0

Diese Art von ungültig macht den Punkt der Verwendung von 'Exec', nicht wahr? – tripleee

+0

@tripleee: Ich denke, OP bedeutete, jede ausführbare Datei auszuführen und nicht die Exec. – codaddict

+0

funktioniert nicht in der Shell-Datei –

18

So etwas sollte funktionieren :

sh -c 'cd /tmp && exec pwd' 
+0

Ich persönlich grabe diese Version –

+0

alle Antworten sind großartig, aber das ist genau das, was ich suchte – mkrufky

+0

+ kurz und süß !! Danke –

82

bash verfügt über eine eingebaute

pushd SOME_PATH 
run_stuff 
... 
... 
popd 
+3

+1, Pushd/Popd ist ideal dafür. Vergessen Sie nicht, vor dem Beenden zu poppen. – Fr0sT

+11

Nicht unbedingt eine gute Lösung, wenn run_stuff fehlschlagen kann (und das Skript beendet wird). Du würdest in SOME_PATH stecken bleiben. –

+1

@ ron.rothmanℝℝ könntest du nicht einfach so etwas wie 'pushed PATH machen; (run_stuff); [["$?" ! = 0]] & & popd; ...; popd' – galois