Wie führe ich 'cd' im Shell-Skript aus und bleibe dort, nachdem das Skript beendet ist?


72

Ich habe 'Verzeichnis ändern' in meinem Shell-Skript verwendet (Bash)

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

pwdwird some_placekorrekt gedruckt , aber nach Abschluss des Skripts ändert sich mein aktuelles Arbeitsverzeichnis nicht.

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


Ich nehme einige Änderungen am Beispielcode vor. In Bash tun CD Sholud in Alias ​​oder Funktion.
Qrtt1

Antworten:


87

Sie müssen die Datei wie folgt beziehen:

. myfile.sh

oder

source myfile.sh

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


16

Das Skript wird in einer separaten Subshell ausgeführt. Diese Subshell ändert das Verzeichnis und nicht die Shell, in der Sie sie ausführen. Eine mögliche Lösung besteht darin, sourcedas Skript zu verwenden, anstatt es auszuführen :

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

15

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

Eine andere Möglichkeit besteht darin, 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 Ihnen Lesezeichen für das Shell-Verzeichnis zu vermitteln.


Ich konnte Argumente an ein Sourcing-Skript übergeben, wie in der Quelle my_script.sh. Myarg myarg hat es als $ 1
dolphus333

4

Dies kann durch Beschaffung erreicht werden. Beim Sourcing wird das Skript im Wesentlichen in derselben Shell ausgeführt, während bei normaler Ausführung ( sh test.shoder ./test.sh) eine Sub-Shell erstellt und das Skript dort ausgeführt wird.

test.sh

cd development/
ls
# Do whatever you want.

Ausführen test.shvon

source test.sh

.ist die kürzeste Notation für source. So können Sie auch durch tun

. test.sh

Dadurch wird das Skript ausgeführt und das Verzeichnis der aktuellen Shell in geändert development/.


1

Wenn Sie ein Skript in Ihrer Login-Shell ausführen, wird ein neuer Unterprozess erzeugt 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 Skript wird das Verzeichnis in den von cd angegebenen Pfad geändert. Nach Abschluss des Skripts kehren Sie jedoch zu Ihrer Anmeldeshell zu dem Arbeitsverzeichnis zurück, von dem aus Sie das Skript gestartet haben.

Der Weg, um dies zu überwinden, ist Verwendung,

source yourscript.sh

Die Quelle führt das Skript als TCL-Skript aus, dh es hat den gleichen Effekt wie bei der Eingabe jeder Zeile in der Befehlszeile Ihrer Anmeldeshell und der Ausführung von dort. Auf diese Weise bleibt das Skript nach Abschluss der CD in diesem Verzeichnis.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.