2010-10-07 4 views
49

hat ich ‚Verzeichnis wechseln‘ in meinem Shell-Skript (bash)Wie führe ich 'cd' im Shell-Skript aus und bleibe dort, nachdem das Skript beendet ist?

#!/bin/bash 
alias mycd='cd some_place' 
mycd 
pwd 

pwd druckt some_place richtig, aber nach dem Skript meines aktuelles Arbeitsverzeichnis ändert sich nicht beendet.

Ist es möglich, meinen Pfad per Skript zu ändern?

+0

Ich mache ein paar Änderungen im Beispielcode. In bash, ** cd ** sholud in Alias ​​oder Funktion. – qrtt1

+0

Ahnlich: [Warum funktioniert "cd" nicht in einem Bash-Shell-Skript? "] (Http://stackoverflow.com/questions/255414/why-doesnt-cd-work-in-a-bash-shell-script) –

Antwort

65

Sie müssen die Datei als zur Quelle:

. myfile.sh 

oder

Ohne Sourcing werden die Änderungen in der Subshell und nicht in der Parent-Shell, die das Skript aufruft, ausgeführt. Wenn Sie jedoch eine Datei als Quelle verwenden, werden die Zeilen in der Datei so ausgeführt, als wären sie in der Befehlszeile eingegeben worden.

14

Das Skript wird in einer separaten Subshell ausgeführt. Das Subshell ändert Verzeichnis, nicht die Shell Sie führen Sie es in Eine mögliche Lösung source ist das Skript, anstatt es zu laufen.

# Bash 
source yourscript.sh 
# or POSIX sh 
. yourscript.sh 
+0

danke für diesen tipp – qrtt1

+0

great tips.mein problem gelöst – Tracy

12

Während das Sourcen des Skripts, das Sie ausführen möchten, eine Lösung ist, sollten Sie beachten, dass dieses Skript die Umgebung Ihrer aktuellen Shell direkt ändern kann. Es ist auch nicht mehr möglich, Argumente zu übergeben.

Eine andere Möglichkeit ist, Ihr Skript als Funktion in bash zu implementieren.

function cdbm() { 
    cd whereever_you_want_to_go 
    echo arguments to the functions were $1, $2, ... 
} 

Diese Technik wird von autojump verwendet: http://github.com/joelthelion/autojump/wiki um Sie mit Shell-Verzeichnis Lesezeichen zu lernen.

1

Wenn Sie ein Skript in Ihrer Anmeldeshell ausführen, wird ein neuer Subprozess generiert und die Skriptausführung in einer Subshell ausgeführt. Sobald das Skript abgeschlossen ist, wird die Subshell beendet und Sie kehren zur Login-Shell zurück ein cd durch ein script, das Verzeichnis wird in den mit cd angegebenen Pfad geändert, aber wenn das Skript beendet ist, kehren Sie zu Ihrer Login-Shell in das Arbeitsverzeichnis zurück, von wo aus Sie das Skript gestartet haben.

Der Weg zur Überwindung dieser Anwendung ist,

source yourscript.sh 

welche Quelle tut, ist es das Skript als TCL Skript ausgeführt, das heißt es die gleiche Wirkung, wie wenn Sie jede Zeile eingegeben auf der Kommandozeile Ihrer Login hat Shell und es von dort ausgeführt. Wenn das Skript nach cd beendet wird, bleibt es in diesem Verzeichnis.

+0

gut erklärt - danke – SaminOz

3

Es kann durch Sourcing erreicht werden. Sourcing ist im Grunde das Skript in der gleichen Shell ausführen, während normale Ausführung (sh test.sh oder ./test.sh) Subshell erstellen und Skript ausführen wird.

testen.sh

cd development/ 
ls 
# Do whatever you want. 

Execute test.sh von

source test.sh 

. ist kürzeste Schreibweise für source. So können Sie auch von

. test.sh 

tun können Dies wird das Skript ausführen, und das Verzeichnis der aktuell Shell zu development/ ändern.

Verwandte Themen