Eines der am häufigsten verwendeten Befehle auf der Kommandozeile ist 'cd'. Jede Anwenderin kennt diesen Befehl und weiss, wie damit umzugehen ist. Wer im Terminal tippt, verwendet 'cd' hunderte Male am Tag. Wieso soll man darüber einen Artikel schreiben? Vielleicht deshalb, weil das 'muscle-brain' sich einige Varianten angewöhnt hat, für die es einfachere Alternativen gibt.
Übrigens ist 'cd' gar kein Kommandozeilen-Befehl, sondern ein Shell-Utility. Ruft doch einmal spasseshalber die Man-page von 'cd' auf:
man cd
Kein Handbucheintrag für cd vorhanden
Warum? Darum:
cd ist kein Befehl, sondern in die Shell eingebaut. Dies ist notwendig, weil das aktuelle Arbeitsverzeichnis durch die Umgebungsvariable PWD gesteuert wird, die nach dem Befehl pwd oder "print working directory" benannt ist. Die Umgebungsvariablen eines Elternprozesses können von einem Kindprozess nicht verändert werden. Wenn die Shell also /bin/cd ausführt, das PWD ändert, würde sich das nur auf /bin/cd und alles, was es ausführt, auswirken. Es würde nicht das PWD der Shell ändern.
'cd' lässt sich auch nicht aus einem Shell-Skript aufrufen, weil das Skript in einer Sub-Shell ausgeführt wird, die keine Auswirkung auf den Elternprozess hat, aus dem das Skript aufgerufen wurde. Das funktioniert nur dann, wenn man das Skript in dem 'cd' verwendet wird, mittels 'Sourcing' aufruft. Nur dann hat das Kommando Auswirkung auf die aufrufende Shell; der Punkt macht hier den Unterschied:
. myscript.sh
Genug des Vorgeplänkels - kommen wir zur Verwendung des 'cd' Befehls. Ich vergleiche das Verhalten in der Bash mit der Z-Shell.
Zweck | Bash (Ubuntu) | Z-Shell (Manjaro) |
Go home | cd | cd |
Zum Verzeichnis auf dieser Ebene | cd verzeichnis_name | verzeichnis_name |
Zu einem beliebigen Verzeichnis | cd /alpha/beta/gamma | alpha/beta/gamma |
Dasselbe mit z.sh | z gamma | z gamma |
Gehe zu Verz. mit Auto-Completion | cd a TAB b TAB g TAB | cd a/b/g TAB |
Gehe ein Verzeichnis höher | cd .. | .. |
Gehe in das zuvor genutzte Verzeichnis | cd - | cd - |
Leider unterstützen weder Bash noch Z-Shell das direkte Anspringen von beliebigen Verzeichnissen, ohne den vollständigen Pfad zu verwenden. Dazu sind Zusatz-Tools notwendig, wie z. B.: autojump, fzf oder z.