Shell-Skripte und Verzeichniswechsel: Warum Dein Skript nicht das Verzeichnis wechselt – und wie Du das Problem löst

Vielleicht kennst Du das Problem: Du hast unter Ubuntu oder Linux Mint ein einfaches Shell-Skript geschrieben, das nur das Verzeichnis wechseln soll. Doch beim Aufruf des Skripts merkst Du, dass das Verzeichnis in Deiner aktuellen Shell nicht gewechselt wird, obwohl der cd-Befehl im Skript steht.

In diesem Artikel erkläre ich Dir, warum das passiert und wie Du es richtig machst.

Das Problem: Skripte laufen in einer Subshell

Wenn Du ein Shell-Skript normal ausführst, passiert das in einer Subshell. Das bedeutet, dass eine neue Shell-Instanz geöffnet wird, die das Skript abarbeitet. Sobald das Skript fertig ist, wird die Subshell geschlossen und Du landest wieder in Deiner ursprünglichen Shell – ohne dass Änderungen wie der Verzeichniswechsel übernommen werden.

Das ist der Grund, warum Dein cd-Befehl zwar innerhalb des Skripts funktioniert, aber nach dem Ende des Skripts Dein Verzeichnis unverändert bleibt.

Die Lösung: Das Skript im aktuellen Shell-Kontext ausführen

Damit das Verzeichnis in Deiner aktuellen Shell geändert wird, musst Du das Skript im aktuellen Shell-Kontext ausführen. Dazu gibt es zwei einfache Möglichkeiten: den Befehl source oder den Punkt ..

Beispiel:

Nehmen wir an, Du hast ein Skript namens wechselverzeichnis.sh, das so aussieht:

#!/bin/bash
cd /pfad/zu/deinem/verzeichnis

Anstatt es wie gewohnt so aufzurufen:

./wechselverzeichnis.sh

musst Du es so aufrufen:

source wechselverzeichnis.sh

oder:

. wechselverzeichnis.sh

Was passiert beim „Sourcen“?

Durch den Aufruf mit source (oder dem Punkt .) wird das Skript nicht in einer Subshell ausgeführt, sondern direkt im Kontext Deiner aktuellen Shell. Alle Änderungen, die das Skript an der Umgebung vornimmt, wie z.B. der Verzeichniswechsel, gelten dann auch für Deine Shell-Sitzung.

Was ist, wenn ich das Skript normal ausführen will?

Wenn Du das Skript weiter wie gewohnt ausführst, also mit ./wechselverzeichnis.sh, dann bleibt es dabei, dass es in einer Subshell läuft. Das kann für andere Arten von Skripten völlig ausreichend sein, aber für Dinge wie cd, die Änderungen an der aktuellen Umgebung vornehmen sollen, ist es nicht die richtige Methode.

Fazit

Wenn Du ein Shell-Skript geschrieben hast, das in Deinem aktuellen Shell-Kontext Änderungen vornehmen soll, wie z.B. den Wechsel des Verzeichnisses mit cd, dann musst Du das Skript „sourcen“ – also mit source oder . aufrufen. Dadurch führst Du das Skript im gleichen Kontext aus, und die Änderungen gelten direkt für Deine aktuelle Shell-Sitzung.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert