Ich möchte nur ein Skript schreiben, das mein Verzeichnis ändert .
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 habe es getan chmod +x pathABC
.
Im Terminal, während /home/alex
ich in bin, laufe ich ./pathABC
, aber die Ausgabe ist gerecht HelloWorld
und das aktuelle Verzeichnis wird nicht geändert.
Also, was ist los?
command-line
scripts
gnome-terminal
Mohammad Reza Rezwani
quelle
quelle
Antworten:
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 gestorben ist, befinden Sie sich wieder in dem Terminal, in dem es sich befunden hat.
Mehrere Alternativen:
1. Symbolischer Link
Platzieren Sie einen Symlink in Ihrem Zuhause auf dem langen Weg, auf den Sie problemlos zugreifen möchten
Greifen Sie dann auf das Verzeichnis zu mit:
2. Alias
Fügen Sie einen Alias in Ihre ~ / .bashrc ein:
(von hier )
3. Funktion
Erstellen Sie eine Funktion, die das Verzeichnis ändert. Die Funktion wird auf Ihrem Terminal ausgeführt und kann dann das Verzeichnis ändern.
(von hier )
4. Vermeiden Sie es, als Kind zu rennen
Quell dein Skript, anstatt es auszuführen. Sourcing (durchgeführt von
.
odersource
) bewirkt, dass das Skript in derselben Shell ausgeführt wird, anstatt in einer eigenen Subshell.(von hier und hier )
5. cd-fähige vars
Setzen Sie die
cdable_vars
Option in Ihrem~/.bashrc
und erstellen Sie eine Umgebungsvariable für das Verzeichnis:Dann können Sie verwenden
cd pathABC
(von hier )
quelle
source
! Ich habe mich immer gefragt, warum ich das tuesource .bashrc
und nichtbash .bashrc
cd $pathABC
?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, dh wo Sie das Skript ausführen, befindet sich noch der alte Pfad. ODER wir können einfach sagen:
The scope of cd command is only for child process not parent
quelle
. pathABC
oder angebensource pathABC
.Sie machen einen Denkfehler. Während sich die aktuelle Shell im selben Verzeichnis befindet, wurde das Skript in das neue Verzeichnis verschoben.
Sie können dies feststellen, indem Sie ein anderes Skript im neuen Verzeichnis erstellen und von Ihrem Skript ausführen, nachdem es das Verzeichnis geändert hat:
Das zweite Skript würde aus dem neuen Verzeichnis ausgeführt.
ist nur die Ausgabe des Skripts.
quelle
pwd
im neuen Verzeichnis ausgeführt werden, anstatt der Situation ein ganz neues Skript hinzuzufügen.Da hallo Welt nur eine Trace-Anweisung ist, versuchen wir Folgendes:
Erstellen Sie eine Bash-Skript-Datei
cd.sh
mit:.sh
Erweiterung ist eine ältere Konvention, nach der Dateinamen von Bash-Skripten erweitert werden. Es ist rein kosmetisch und normalerweise unnötig. In diesem Fall ist es jedoch wichtig, sich vom Kernbefehl zu unterscheidencd
.Markieren Sie die ausführbare Bash-Skriptdatei mit:
Führen Sie nun die Datei aus:
cd
wir wissen alle.$(...)
Führt den Befehl in Klammern aus und gibt die Ausgabe zurück.cd.sh
in Ihrem Pfad war, müssen Sie nicht angeben, wo es ist. Wir setzen das Präfix,./
um anzugeben, dass sich der Befehl im aktuellen Verzeichnis befindet.echo
Ausgabe descd.sh
Skripts wird über die an das übergeordnete Element zurückgesendet$(...)
. Das übergeordnete Element (unsere Shell-Eingabeaufforderung) verwendet diese Ausgabe und übergibt sie an den Linux-cd
Befehl.Wie andere bereits erwähnt haben, kann ein untergeordneter Prozess das übergeordnete Verzeichnis nicht ändern. Auf diese Weise kann das Kind dem Elternteil mitteilen, wohin es nach Beendigung des Prozesses gehen soll.
quelle
14.04
Version, die ich vor ungefähr einer Stunde gelesen habe?cd /home/mike/Documents/A/B/C
:, der keine Ausgabe erzeugte. Jetzt ist esecho "/home/mike/Documents/A/B/C"
, was Output erzeugt../cd.sh
es jetzt,cd $(./cd.sh)
aber es erreicht das Ziel, dass das Kind das aktuelle Verzeichnis des Elternteils ändert. Ja, es ist unkonventionell, aber ich hoffe, die Leute finden es auch interessant.