Durch Ändern des Verzeichnisses im Skript wird das Verzeichnis nicht geändert – warum?

Durch Ändern des Verzeichnisses im Skript wird das Verzeichnis nicht geändert – warum?

Ich habe gesehendiese Antwortseitdem habe ich danach gesucht, aber zunächst habe ich dieses Skript geschrieben:

for i in `seq 1 $1`; 
   do cd ../;
done;

Es ändert das Verzeichnis nicht. Warum läuft das als

./updir.sh 5

Antwort1

Wenn Sie ein Skript wie gezeigt ausführen, wird eine kopierte Umgebung in einer Unter-Shell erstellt, und alle von Ihnen vorgenommenen Änderungen, z. B. das Festlegen von Verzeichnissen oder Umgebungsvariablen, wirken sich nur auf diese Unter-Shell-Umgebung aus, nicht auf die aufrufende Shell.

Um von einem Skript aus Änderungen an der aktuellen Shell vorzunehmen, müssen Sie das Skript mit dem Befehl sourceoder innerhalb der aktuellen Shell ausführen .:

. ./updir.sh 5

Sie können dies mit einem Alias ​​automatisieren:

alias updir='. ./updir.sh'

Alternativ können Sie anstelle eines Skripts auch eine Funktion verwenden:

updir()
{   for i in `seq 1 $1`; 
       do cd ../;
    done
}

Antwort2

Weil Skripte in einer Subshell ausgeführt werden, die das aktuelle Arbeitsverzeichnis separat verwaltet. Die einfachste Lösung ist die Verwendung einer Funktion:

function updir() {
  for i in $(seq 1 $1); do
    cd ..
  done
}

verwandte Informationen