Ist es möglich, das aktuelle Verzeichnis über ein Skript zu ändern?
Ich möchte ein Dienstprogramm für die Verzeichnisnavigation in Bash erstellen. Ich habe ein Testskript erstellt, das wie folgt aussieht:
#!/bin/bash
cd /home/artemb
Wenn ich das Skript über die Bash-Shell ausführe, ändert sich das aktuelle Verzeichnis nicht. Ist es überhaupt möglich, das aktuelle Shell-Verzeichnis von einem Skript aus zu ändern?
bash
environment
artemb
quelle
quelle
pushd
(möglicherweise umgeleitet,>/dev/null
um die Ausgabe zu unterdrücken) verwendencd
, können Sie später mit zum vorherigen Verzeichnis zurückkehrenpopd
.Antworten:
Sie müssen Ihr Skript in eine Shell-Funktion konvertieren:
Der Grund dafür ist, dass jeder Prozess sein eigenes aktuelles Verzeichnis hat und wenn Sie ein Programm über die Shell ausführen, wird es in einem neuen Prozess ausgeführt. Die Standards "cd", "pushd" und "popd" sind in den Shell-Interpreter integriert, sodass sie den Shell-Prozess beeinflussen.
Indem Sie Ihr Programm zu einer Shell-Funktion machen, fügen Sie Ihren eigenen In-Process-Befehl hinzu, und jede Verzeichnisänderung wird im Shell-Prozess wiedergegeben.
quelle
Wenn Sie Ihr Skript starten, wird ein neuer Prozess erstellt, der nur Ihre Umgebung erbt. Wenn es endet, endet es. Ihre aktuelle Umgebung bleibt wie sie ist.
Stattdessen können Sie Ihr Skript folgendermaßen starten:
Das
.
Skript wird in der aktuellen Umgebung ausgewertet, sodass es möglicherweise geändert wirdquelle
.sh
Erweiterungen völlig eww. Benutze sie nicht.Angesichts der Unlesbarkeit und Überkomplikation von Antworten glaube ich, dass der Antragsteller dies tun sollte
PATH
. scriptname
Der
.
(Punkt) stellt sicher, dass das Skript nicht in einer untergeordneten Shell ausgeführt wird.quelle
Wenn Sie das Obige zusammenfügen, können Sie einen Alias erstellen
wenn Sie nicht das führende "." Jedes Mal, wenn Sie Ihr Skript in die Shell-Umgebung einbinden möchten oder wenn Sie sich einfach nicht daran erinnern möchten, muss dies getan werden, damit das Skript ordnungsgemäß funktioniert.
quelle
~/.bash_aliases
wird beim Start von Bash nicht immer bezogen.Wenn Sie bash verwenden, können Sie Alias versuchen:
Fügen Sie in die .bashrc-Datei diese Zeile ein:
Wenn Sie "p" in die Befehlszeile schreiben, wird das Verzeichnis geändert.
quelle
Wenn Sie ein Bash-Skript ausführen, wird es in der aktuellen Umgebung oder in den untergeordneten Umgebungen ausgeführt, niemals in der übergeordneten.
Wenn das Ziel darin besteht, Ihren Befehl auszuführen: goto.sh / home / test Dann arbeiten Sie interaktiv in / home / test. Eine Möglichkeit besteht darin, eine interaktive Bash-Subshell in Ihrem Skript auszuführen:
Auf diese Weise befinden Sie sich in / home / test, bis Sie diese Shell verlassen (exit oder Strg + C).
quelle
Mit pushd wird das aktuelle Verzeichnis auf den Verzeichnisstapel verschoben und in das angegebene Verzeichnis geändert. Popd ruft das Verzeichnis oben auf dem Stapel ab und wechselt dann in dieses Verzeichnis.
quelle
Einfach gehen zu
und fügen Sie diesen Code neben der letzten Zeile hinzu:
Beenden Sie dann den Editor.
Geben Sie dann Folgendes ein:
Jetzt können Sie Folgendes verwenden: Ihren Befehl im Terminal
quelle
Ich habe ein Skript zum Ändern des Verzeichnisses erstellt. Schauen Sie sich das an: https://github.com/ygpark/dj
quelle
Grundsätzlich kommen wir
cd..
aus jedem Verzeichnis zurück. Ich dachte, es einfacher zu machen, indem ich die Anzahl der Verzeichnisse angab, mit denen Sie gleichzeitig zurückkehren müssen. Sie können dies mithilfe des Alias-Befehls mithilfe einer separaten Skriptdatei implementieren. Beispielsweise:code.sh
Nach der Verwendung
source code.sh
in der aktuellen Shell können Sie Folgendes verwenden:zwei Schritte vom aktuellen Verzeichnis zurück zu kommen. Erklärt über im Detail hier . Dort wird auch erklärt, wie der Code in ~ / .bashrc eingefügt wird, damit jede neu geöffnete Shell automatisch diesen neuen Alias-Befehl erhält. Sie können einen neuen Befehl hinzufügen, um zu bestimmten Verzeichnissen zu gelangen, indem Sie den Code ändern, indem Sie weitere
if conditions
und unterschiedliche Argumente hinzufügen . Sie können den Code auch hier von git abrufen .quelle
Dieser Ansatz ist für mich einfacher.
Angenommen, auf einem persönlichen iMac, auf dem Sie Administrator sind, befindet sich unter dem Standardverzeichnis beim Öffnen eines Befehlsfensters / Users / jdoe das Verzeichnis, in das Sie wechseln müssen: /Users/jdoe/Desktop/Mongo/db.3.2.1 /Behälter.
Dies sind die Schritte, mit denen die Arbeit erledigt werden kann:
cd /Users/jdoe/Desktop/Mongo/db.3.2.1/bin
als erste Zeile.chmod 755 mongobin
source mongobin
pwd
Voila!
quelle
Ich habe auch ein Dienstprogramm namens goat erstellt , das Sie zur einfacheren Navigation verwenden können.
Sie können den Quellcode auf GitHub anzeigen .
Ab Version 2.3.1 sieht die Nutzungsübersicht folgendermaßen aus:
quelle
Ich mache gerne dasselbe für verschiedene Projekte, ohne eine neue Shell zu starten.
In deinem Fall:
Speichern Sie das Skript als:
Dann starten Sie es mit:
Dann gelangen Sie mit derselben Shell in das Verzeichnis.
quelle
Fügen Sie in Ihrem Shellscript Folgendes hinzu:
quelle
Erkläre deinen Weg:
quelle
Schreiben Sie einfach
PWD
in Ihr Skript und exportieren Sie es, und die Änderung bleibt bestehen.quelle