Warum bin ich nach dem Ausführen einer Bash-Datei immer wieder zu Hause?

1

In meiner Bash-Datei habe ich darum gebeten, zu einem Unterverzeichnis zu navigieren, eine Datei zu entpacken und dort zu bleiben, aber wenn ich pwd eingebe, kann ich sehen, dass ich immer zu meinem Heimatverzeichnis zurück bin. Warum ?

Gibt es eine Möglichkeit, Shell Stick auf Subdir zu bekommen?

heavyyd
quelle

Antworten:

2

Wenn Sie ein Skript ausführen, wird eine neue Subshell dafür geöffnet, wodurch die Umgebungsvariablen (einschließlich Ihres Arbeitsverzeichnisses: $ PWD) der Shell, in der Sie sich befinden, nicht geändert werden. Wenn Sie möchten, dass das Skript in derselben Shell wie Sie ausgeführt wird Dadurch werden die Änderungen der Umgebungsvariablen beibehalten und nicht ausgeführt, sondern als Quelle verwendet. So was:

source my-script

oder:

. my-script

Dies lässt jedoch jede temporäre Variable zurück, die Ihr Skript verwendet. Wenn Sie dies vermeiden möchten, erstellen Sie eine Funktion innerhalb des Skripts und deklarieren Sie alle temporären Variablen als lokal. So was:

function main()
{
    local var1=whatever
    cd /path/to
    do-something
    ...
}

main

Wenn dies mit aufgerufen sourcewird, bleiben alle Variablenänderungen wie im Arbeitsverzeichnis, jedoch keine temporären Variablen zurück.

petersohn
quelle
+1, um auf den "variablen Rückstand" hinzuweisen und eine Lösung dafür zu finden.
DevSolar
4

Beim Ausführen eines Skripts wird es in einem separaten Prozess ausgeführt. Änderungen am Arbeitsverzeichnis, an den Umgebungsvariablen usw. gehen beim Beenden des Skripts verloren.

Um das Skript im aktuellen Bash-Prozess auszuführen, müssen Sie das Skript als Quelle verwenden

. myscript.sh
Ignacio Vazquez-Abrams
quelle
Gibt es dann eine Möglichkeit, sie wissen zu lassen, dass ich bleiben möchte, wo ich war?
1
mywiki.wooledge.org/BashFAQ/060
Ignacio Vazquez-Abrams
1

Ja, Sie können hierfür eine Funktion erstellen. Erstellen Sie zunächst ein Skript, das die ganze schwere Arbeit erledigt.

Dann erstelle eine Funktion in .bashrc wie folgt:

xcd () {
    local archive="$1" dir="$2"

    your_script "$archive"
    cd "$dir"
}

Im Gegensatz zu ganzen Skripten werden Funktionen im Kontext der aktuellen Shell ausgeführt.

In den BASH-FAQ finden Sie eine Erklärung .

Aaron Digulla
quelle
0

Ihr Bash-Skript erbt eine Kopie der Umgebung der aufrufenden Shell (Arbeitsverzeichnis, Shell-Variablen usw.), die beim Beenden des Skripts verworfen wird. Wenn Sie Shell-Variablen testen, indem Sie z. B. "echo $ foo" eingeben, behalten sie den Wert bei (oder sind nicht vorhanden), den sie vor dem Ausführen des Skripts hatten, genau wie pwd.

JRobert
quelle