Ich möchte ein Skript ausführen, um einfach das aktuelle Arbeitsverzeichnis zu ändern:
#!/bin/bash
cd web/www/project
Aber nachdem ich es ausgeführt habe, bleibt die aktuelle pwd unverändert! Wie kann ich das machen?
Ich möchte ein Skript ausführen, um einfach das aktuelle Arbeitsverzeichnis zu ändern:
#!/bin/bash
cd web/www/project
Aber nachdem ich es ausgeführt habe, bleibt die aktuelle pwd unverändert! Wie kann ich das machen?
Antworten:
Es ist ein erwartetes Verhalten und wurde bereits mehrmals diskutiert.
Das Skript wird in einer Subshell ausgeführt und kann das Arbeitsverzeichnis der übergeordneten Shell nicht ändern. Seine Effekte gehen verloren, wenn es beendet ist.
Um Verzeichnis wechseln permanent sollten Sie beziehen das Skript, wie in
. ./script
source ./script
das selbe
.
und source
sind gleich in bash. 2. Der ./
Dateiname muss nicht vor dem Dateinamen stehen, wenn er sich im selben Verzeichnis befindet. Es ist in . script
Erstellen Sie für kleine Aufgaben wie diese einen Alias, anstatt ein Skript zu erstellen.
$ alias cdproj='cd /dir/web/www/proj'
Sie sollten dies zu Ihrer .bashrc
Datei hinzufügen , wenn Sie dies für jede interaktive Shell festlegen möchten.
Jetzt können Sie dies als ausführen $ cdproj
.
eval `./script`
oder eval $(./script)
auszuführen. Dies ist ein gängiger Ansatz für Befehle, die die Umgebung der aufrufenden Shell aktualisieren müssen.
eval
Ansatz wählen.
exec bash
am EndeEin Bash-Skript kann in seiner aktuellen Umgebung oder in der seiner untergeordneten, jedoch niemals in seiner übergeordneten Umgebung ausgeführt werden.
Diese Frage wird jedoch häufig gestellt, weil man nach der Ausführung eines Bash-Skripts aus einem anderen Verzeichnis an der Bash-Eingabeaufforderung in einem bestimmten Verzeichnis belassen werden möchte .
Wenn dies der Fall ist, führen Sie am Ende des Skripts einfach eine untergeordnete Bash-Instanz aus:
#!/usr/bin/env bash
cd desired/directory
exec bash
Dadurch wird eine neue Unterschale erstellt. Geben Sie ein exit
, um zur ersten Shell zurückzukehren, in der das Skript ursprünglich gestartet wurde.
exec
als letzte Möglichkeit eines Schurken gilt. :)
exit
(oder Strg + D) sauber zu beenden , müssen Sie dies 11 bis 21 Mal tun. (2) Ein weiterer Nachteil der Verwendung eines ausführbaren Skripts besteht darin, dass Sie beim Festlegen von Shell-Optionen (z. B. dotglob
oder globstar
) in Ihrer interaktiven Shell-Sitzung diese verlieren, da Sie eine neue Shell starten.
Während es Antworten gibt, die genau die gewünschte Aktion ausführen, besteht eine Standardmethode für diesen Zweck darin, eine symbolische Verknüpfung zu erstellen:
ln -s ~/web/www/project proj #use full path to dir!
Dann könnten Sie cd
das Verzeichnis mit dem Namen proj
:
cd proj
Diese Methode ist flexibler, da Sie unter Verwendung des Kurznamens auf Dateien zugreifen können, ohne cd
:
ls proj/ #note the endslash!
vim proj/file.x
Je nachdem, was Sie tun möchten, kann eine andere Lösung darin bestehen, eine Funktion anstelle eines Skripts zu erstellen.
Beispiel:
Erstellen Sie eine Funktion in einer Datei, sagen wir /home/aidin/my-cd-script
:
function my-cd() {
cd /to/my/path
}
Fügen Sie es dann in Ihre bashrc
oder zshrc
Datei ein:
# Somewhere in rc file
source /home/aidin/my-cd-script
Jetzt können Sie es wie einen Befehl verwenden:
$ my-cd
Warum nicht "exec" verwenden, um genau das zu tun, was ich mir wünsche?
#!/bin/bash
cd someplace
exec bash
~/someplace
exit
(oder Strg + D) sauber zu beenden , müssen Sie dies 11 bis 21 Mal tun.
dotglob
oder globstar
) diese verlieren, da Sie eine neue Shell starten. … (Fortsetzung)
Sie können dies mit einer Funktion oder mit && tun. In den folgenden Beispielen wird Zabbix installiert und eine Datei mit einer Zeile darin erstellt.
Ex:
#!/bin/bash
# Create Function:
installZabbix(){
cd /usr/src/zabbix-4.2.4;
./configure --enable-agent;
make install;
cd /usr/src/;
>file;
echo "Hi, this is a file." >>file;
}
# Call the function:
installZabbix
oder:
#!/bin/bash
cd /usr/src/zabbix-4.2.4 && ./configure --enable-agent && make install && cd /usr/src && >file && echo "Hi, this is a file." >>file
return
, um aus einem Skript zu entkommen, das auf diese Weise erstellt wurde, nichtexit
- sie ähneln Shell-Funktionen undexit
beenden die Shell, die das Skript erstellt hat.