
Ich möchte nur ein Skript schreiben, dasändert mein Verzeichnis.
Ich habe die folgenden Befehle in die Datei eingefügt/home/alex/pathABC
#!/bin/sh
cd /home/alex/Documents/A/B/C
echo HelloWorld
Ich tat
chmod +x pathABC
Ich habe im Terminal während /home/alex
ich in war die Funktion ausgeführt ./pathABC
, aber die Ausgabe lautet nur HelloWorld
und das aktuelle Verzeichnis wird nicht geändert.
Was ist also falsch?
Antwort1
Wie andere bereits erklärt haben, wird das Verzeichnis im untergeordneten Prozess Ihres Skripts geändert, nicht im Terminalprozess, von dem aus das Skript aufgerufen wird. Nachdem der untergeordnete Prozess beendet wurde, befinden Sie sich wieder im Terminal, das dort verbleibt, wo es war.
Mehrere Alternativen:
1. Symbolischer Link
Legen Sie in Ihrem Home-Bereich einen Symlink zu dem langen Pfad an, auf den Sie einfach zugreifen möchten
$ ln -s /home/alex/Documents/A/B/C ~/pathABC
Greifen Sie dann mit folgendem Befehl auf das Verzeichnis zu:
$ cd ~/pathABC
2. Alias
Fügen Sie einen Alias in Ihre ~/.bashrc ein:
alias pathABC="cd /home/alex/Documents/A/B/C"
(ausHier)
3. Funktion
Erstellen Sie eine Funktion, die das Verzeichnis ändert. Die Funktion wird im Prozess Ihres Terminals ausgeführt und kann dann das Verzeichnis ändern.
(ausHier)
4. Vermeiden Sie das Laufen als Kind
Geben Sie Ihr Skript als Quelle an, anstatt es auszuführen. Durch die Angabe der Quelle (durchgeführt durch .
oder source
) wird das Skript in derselben Shell ausgeführt, anstatt in einer eigenen Subshell.
$ . ./pathABC
5. CD-fähige Variablen
Legen Sie die cdable_vars
Option in Ihrem fest ~/.bashrc
und erstellen Sie eine Umgebungsvariable für das Verzeichnis:
shopt -s cdable_vars
export pathABC="/home/alex/Documents/A/B/C"
Dann können Sie verwendencd pathABC
(ausHier)
Antwort2
Wenn Sie ein Skript in einem Terminal ausführen, wird ein untergeordneter Prozess ausgeführt. In diesem untergeordneten Programm wechselt Ihr Skript in das angegebene Verzeichnis. Aber im übergeordneten Prozess, also dort, wo Sie das Skript ausführen, befindet es sich immer noch im alten Pfad. Oder wir können einfach sagen:
Der Gültigkeitsbereich des CD-Befehls bezieht sich nur auf untergeordnete Prozesse, nicht auf übergeordnete Prozesse.
Antwort3
Sie machen einen Denkfehler. Während die aktuelleHülsebleibt im gleichen Verzeichnis, dieSkriptwurde in das neue Verzeichnis verschoben.
Sie können dies überprüfen, indem Sie ein weiteres Skript imneuVerzeichnis und führen Sie es von Ihrem Skript aus aus, nachdem es das Verzeichnis geändert hat:
#!/bin/sh
cd /home/alex/Documents/A/B/C && ./another_script.sh # (if it is executable)
Das zweite Skript würde aus dem neuen Verzeichnis ausgeführt werden.
HelloWorld
ist nur die Ausgabe des Skripts.
Antwort4
$SHELL
Am Ende verwenden
Ein Bash-Skript wird in seiner aktuellen Umgebung oder in der seiner untergeordneten Umgebung ausgeführt, jedoch nie in seiner übergeordneten Umgebung.
Diese Frage wird jedoch oft gestellt, weil manum nach der Ausführung in einer Eingabeaufforderung in einem bestimmten Verzeichnis belassen zu werdeneines Skripts aus einem anderen Verzeichnis.
Wenn dies der Fall ist, einfachAusführen einer untergeordneten $SHELL
Instanzam Ende des Skripts:
# !/usr/bin/env bash
cd /home/alex/Documents/A/B/C
echo -e '\nHit [Ctrl]+[D] to exit this child shell.'
$SHELL
Um zur vorherigen, übergeordneten Shell-Instanz zurückzukehren, verwenden Sie Ctrl+ D.