In dem Film Buckaroo Banzai – Die 8. Dimension, einem Kultklassiker von 1984, präsentiert uns der verwegene Titelheld folgende Zen-artige Weisheit: »Wohin auch immer du gehst… dort bist du.« Buckaroo hätte durchaus über das Linux-Dateisystem sprechen können:
$ cd /usr/share/lib/etc/bin Wohin auch immer du gehst...
$ pwd
/usr/share/lib/etc/bin ...dort bist du.
Es ist außerdem so, dass Sie, egal wo Sie im Linux-Dateisystem sind – in Ihrem aktuellen Verzeichnis –, irgendwann woanders hingehen werden (in ein anderes Verzeichnis). Je schneller und effizienter Sie diese Navigation erledigen können, umso produktiver werden Sie sein.
Die Techniken in diesem Kapitel helfen Ihnen, schneller und mit weniger Aufwand beim Tippen durch das Dateisystem zu navigieren. Sie sehen täuschend einfach aus, haben dafür aber enorme Auswirkungen, eine niedrige Lernkurve und großen Nutzen. Diese Techniken fallen im Großen und Ganzen in zwei Kategorien:
Eine schnelle Auffrischung zu Linux-Verzeichnissen finden Sie in Anhang A. Nutzen Sie eine andere Shell als die bash, werfen Sie einen Blick in Anhang B.
Wenn Sie zehn Linux-Experten fragen, welcher der lästigste Aspekt der Kommandozeile ist, werden sieben von ihnen sagen: »Das Eintippen der langen Verzeichnispfade.«1 Falls nämlich Ihre Arbeitsdateien in /home/smith/Work/Projects/Apps/Neutron-Star/src/include liegen, Ihre Finanzdokumente sich in /home/smith/Finances/Bank/Checking/Statements befinden und Ihre Videos in /data/Arts/Video/Collection versammelt sind, ist es überhaupt nicht witzig, immer und immer wieder diese Pfade eintippen zu müssen. In diesem Abschnitt lernen Sie Techniken kennen, um effizient zu einem bestimmten Verzeichnis zu gelangen.
Beginnen wir mit den Grundlagen. Wo auch immer Sie in Ihrem Dateisystem sind, Sie können direkt in Ihr Home-Verzeichnis zurückkehren, indem Sie cd ohne Argumente ausführen:
$ pwd
/etc Sie beginnen irgendwo anders,
$ cd führen cd ohne Argumente aus...
$ pwd
/home/smith ...und sind wieder zu Hause.
Um von irgendeiner Stelle im Dateisystem in Unterverzeichnisse Ihres Home-Verzeichnisses zu springen, bezeichnen Sie Ihr Home-Verzeichnis mit einer Kurzform statt mit einem absoluten Pfad wie /home/smith. Eine Kurzform ist die Shell-Variable HOME:
$ cd $HOME/Work
Eine andere bietet die Tilde:
$ cd ~/Work
Sowohl $HOME als auch ~ sind Ausdrücke, die von der Shell erweitert werden, eine Tatsache, die Sie überprüfen können, indem Sie sie auf der Standardausgabe anzeigen lassen:
$ echo $HOME ~
/home/smith /home/smith
Die Tilde kann auch das Home-Verzeichnis eines anderen Benutzers benennen, wenn Sie sie unmittelbar vor dessen Benutzernamen setzen:
$ echo ~jones
/home/jones
Sparen Sie sich beim Eingeben von cd-Befehlen Tipparbeit, indem Sie die Tab-Taste drücken. Dabei werden automatisch Verzeichnisnamen angegeben. Besuchen Sie zum Beispiel mal ein Verzeichnis, das Unterverzeichnisse enthält, wie etwa /usr:
$ cd /usr
$ ls
bin games include lib local sbin share src
Nehmen wir an, Sie wollten das Unterverzeichnis share aufsuchen. Tippen Sie sha ein und drücken Sie dann einmal die Tab-Taste:
$ cd sha<Tab>
Die Shell ergänzt den Verzeichnisnamen für Sie:
$ cd share/
Diese praktische Abkürzung wird Tab-Ergänzung genannt. Sie funktioniert sofort, wenn der Text, den Sie eingeben, einem einzigen Verzeichnisnamen entspricht. Passt der Text zu mehreren Verzeichnisnamen, benötigt Ihre Shell weitere Informationen, um den gewünschten Namen zu vervollständigen. Angenommen, Sie hätten nur s eingetippt und dann Tab gedrückt:
$ cd s<Tab>
Die Shell kann den Namen share (noch) nicht vervollständigen, weil auch andere Verzeichnisse mit s beginnen: sbin und src. Drücken Sie ein zweites Mal Tab. Die Shell gibt nun alle möglichen Ergänzungen aus, um Ihnen zu helfen:
$ cd s<Tab><Tab>
sbin/ share/ src/
Dann wartet sie auf Ihre nächste Aktion. Um diese Mehrdeutigkeit aufzulösen, tippen Sie ein weiteres Zeichen ein, h, und drücken dann noch einmal Tab:
$ cd sh<Tab>
Die Shell vervollständigt den Namen des Verzeichnisses für Sie, und aus sh wird share:
$ cd share/
Im Allgemeinen drücken Sie Tab einmal, um so viele Ergänzungen wie möglich zu erreichen, oder Sie drücken Tab zweimal, um alle möglichen Ergänzungen auszugeben. Je mehr Zeichen Sie eintippen, umso weniger Mehrdeutigkeit gibt es, und umso besser wird der Treffer.
Die Tab-Ergänzung eignet sich hervorragend zum Beschleunigen der Navigation. Anstatt einen langen Pfad wie /home/smith/Projects/Web/src/include einzutippen, geben Sie so wenig ein, wie Sie wollen, und drücken einfach immer wieder die Tab-Taste. Mit ein bisschen Übung bekommen Sie den Bogen schnell raus.
Die Tab-Ergänzung variiert je nach Programm Die Tab-Ergänzung eignet sich nicht nur für cd-Befehle. Sie funktioniert für die meisten Befehle, allerdings kann ihr Verhalten variieren. Beim Befehl cd ergänzt die Tab-Taste die Verzeichnisnamen. Bei anderen Befehlen, die auf Dateien operieren, wie cat, grep und sort, erweitert die Tab-Ergänzung auch Dateinamen. Lautet der Befehl ssh (Secure Shell), vervollständigt sie Hostnamen. Beim Befehl chown (Ändern des Besitzers einer Datei) werden Benutzernamen vervollständigt. Sie können sogar Ihre eigenen Ergänzungsregeln herstellen, um schneller zu werden, wie wir in Beispiel 4-1 sehen werden. Schauen Sie außerdem auch in man bash und lesen Sie den Abschnitt »programmable completion«. |
Sollten Sie häufig ein weit entfernt liegendes Verzeichnis besuchen, wie etwa /home/smith/Work/?Projects?/Web/src/include, legen Sie sich am besten einen Alias an, der die cd-Operation ausführt:
# In einer Shell-Konfigurationsdatei:
alias work="cd $HOME/Work/Projects/Web/src/include"
Führen Sie einfach jedes Mal den Alias aus, wenn Sie Ihr Ziel erreichen wollen:
$ work
$ pwd
/home/smith/Work/Projects/Web/src/include
Stellen Sie alternativ eine Variable für den Verzeichnispfad her:
$ work=$HOME/Work/Projects/Web/src/include
$ cd $work
$ pwd
/home/smith/Work/Projects/Web/src/include
$ ls $work/
css Benutzt die Variable auf andere Arten.
main.css mobile.css
Falls Sie regelmäßig viele Verzeichnisse mit langen Pfadnamen besuchen, können Sie Aliase oder Variablen für sie alle herstellen. Das bringt jedoch einige Nachteile mit sich:
Eine Alternative besteht darin, eine Shell-Funktion wie in Beispiel 4-1 herzustellen, die ich qcd (quick cd) genannt habe. Diese Funktion nimmt einen String-Schlüssel als Argument entgegen, wie work oder recipes, und führt cd auf einem ausgewählten Verzeichnispfad aus.
Beispiel 4-1: Eine Funktion für den Wechsel in weit entfernte Verzeichnisse mit cd
# Definieren der Funktion qcd
qcd () {
# Nimmt 1 Argument entgegen, das ein String-Schlüssel ist, und
# führt für jeden Schlüssel eine andere "cd"-Operation aus.
case "$1" in
work)
cd $HOME/Work/Projects/Web/src/include
;;
recipes)
cd $HOME/Family/Cooking/Recipes
;;
video)
cd /data/Arts/Video/Collection
;;
beatles)
cd $HOME/Music/mp3/Artists/B/Beatles
;;
*)
# Das angegebene Argument gehörte nicht zu den unterstützten Schlüsseln.
echo "qcd: unknown key '$1'"
return 1
;;
esac
# Der aktuelle Verzeichnisname wird ausgegeben, damit man weiß, wo man ist.
pwd
}
# Einrichten einer Tab-Ergänzung
complete -W "work recipes video beatles" qcd
Speichern Sie die Funktion in einer Shell-Konfigurationsdatei wie $HOME/.bashrc (siehe »Umgebungen und Initialisierungsdateien, die Kurzfassung« auf Seite 49) und laden Sie diese neu. Damit ist sie bereit für den Einsatz. Tippen Sie qcd gefolgt von einem der unterstützten Schlüssel ein, um schnell in das damit verknüpfte Verzeichnis zu springen:
$ qcd beatles
/home/smith/Music/mp3/Artists/B/Beatles
Als Bonus führt die letzte Zeile des Skripts den Befehl complete aus, ein Shell-Builtin, das eine angepasste Tab-Ergänzung für qcd einrichtet, damit es die vier unterstützten Schlüssel vervollständigt. Nun müssen Sie sich die Argumente von qcd nicht mehr merken! Tippen Sie einfach qcd gefolgt von einem Leerzeichen ein und drücken Sie dann zweimal die Tab-Taste. Die Shell gibt nun alle Schlüssel für Ihre Referenz aus, und Sie können den gewünschten Schlüssel auf die übliche Weise vervollständigen:
$ qcd <Tab><Tab>
beatles recipes video work
$ qcd v<Tab><Enter> Ergänzt 'v' zu 'video'.
/data/Arts/Video/Collection
Die qcd-Funktion verarbeitet nur die Verzeichnisse, die Sie angeben. Die Shell bietet eine allgemeinere cd-Lösung ohne diese Einschränkung, den sogenannten cd-Suchpfad. Seit ich diese Shell-Eigenschaft kenne, navigiere ich ganz anders im Linux-Dateisystem.
Nehmen wir einmal an, Sie hätten ein wichtiges Unterverzeichnis namens Photos, das Sie oft besuchen. Es liegt unter /home/smith/Family/Memories/Photos. Wenn Sie sich im Dateisystem umherbewegen, müssen Sie jedes Mal einen langen Pfadnamen eintippen, um Photos zu besuchen:
$ cd ~/Family/Memories/Photos
Wäre es nicht großartig, wenn Sie diesen Pfad auf Photos abkürzen könnten, ganz egal, wo Sie sich im Dateisystem gerade befinden?
$ cd Photos
Normalerweise funktioniert dieser Befehl nicht:
bash: cd: Photos: No such file or directory
Es sei denn, Sie befinden sich gerade im richtigen Parent-Verzeichnis (~/Family/Memories) oder in einem anderen Verzeichnis, das zufällig ebenfalls ein Unterverzeichnis mit dem Namen Photos enthält. Nun, mit ein paar kleinen Vorbereitungen können Sie cd anweisen, auch an anderen Orten als Ihrem aktuellen Verzeichnis nach dem Photos-Unterverzeichnis zu suchen. Die Suche erfolgt blitzschnell und in allen Parent-Verzeichnissen, die Sie angeben. Sie könnten zum Beispiel cd anweisen, zusätzlich zu Ihrem aktuellen Verzeichnis auch das Verzeichnis $HOME/Family/Memories zu durchsuchen. Wenn Sie dann an irgendeiner anderen Stelle im Dateisystem cd Photos eintippen, wird cd erfolgreich sein:
$ pwd
/etc
$ cd Photos
/home/smith/Family/Memories/Photos
Ein cd-Suchpfad funktioniert genauso wie der Befehlssuchpfad, $PATH, allerdings werden anstelle von Befehlen Unterverzeichnisse gefunden. Konfigurieren Sie ihn mit der Shell-Variablen CDPATH, die dasselbe Format hat wie PATH: eine Liste von Verzeichnissen, die durch Doppelpunkte getrennt sind. Falls Ihr CDPATH zum Beispiel aus diesen vier Verzeichnissen besteht:
$HOME:$HOME/Projects:$HOME/Family/Memories:/usr/local
und Sie …
$ cd Photos
eintippen, prüft cd nacheinander, ob die folgenden Verzeichnisse existieren, bis es ein passendes findet oder komplett scheitert:
In diesem Fall ist cd beim vierten Versuch erfolgreich und ändert das Verzeichnis auf $HOME/Family/Memories/Photos. Wenn zwei Verzeichnisse in $CDPATH ein Unterverzeichnis namens Photos besitzen, gewinnt das Parent-Verzeichnis, das zuerst kommt.
Hinweis Normalerweise liefert ein erfolgreiches cd keine Ausgabe. Wenn cd jedoch mithilfe Ihres CDPATH ein Verzeichnis findet, gibt es den absoluten Pfad auf der Standardausgabe aus, um Sie über das neue aktuelle Verzeichnis in Kenntnis zu setzen: |
|
|
$ CDPATH=/usr Setzt einen CDPATH. $ cd /tmp Keine Ausgabe: CDPATH wurde nicht befragt. $ cd bin cd befragt CDPATH... /usr/ bin ...und gibt das neue Arbeitsverzeichnis aus. |
Setzen Sie Ihre wichtigsten oder am häufigsten benutzten Parent-Verzeichnisse in CDPATH, und Sie können mit cd von beliebigen Stellen in Ihrem Dateisystem aus in deren Unterverzeichnisse springen, ohne den kompletten Pfad eintippen zu müssen. Vertrauen Sie mir, das ist erstaunlich. Die folgende Fallstudie sollte das beweisen.
Benutzen wir CDPATH, um die Art und Weise zu vereinfachen, wie Sie zu Ihrem Home-Verzeichnis navigieren. Mit einer kleinen Konfiguration können Sie viele Verzeichnisse innerhalb Ihres Home-Verzeichnisses leicht zugänglich machen, ohne viel tippen zu müssen, und das unabhängig davon, wo Sie sich in Ihrem Dateisystem befinden. Diese Technik funktioniert am besten, wenn Ihr Home-Verzeichnis gut organisiert ist und wenigstens zwei Ebenen an Unterverzeichnissen besitzt. Abbildung 4-1 zeigt ein Beispiel für ein gut organisiertes Verzeichnislayout.
Der Trick besteht darin, Ihren CDPATH so einzurichten, dass er in der angegebenen Reihenfolge Folgendes enthält:
Abbildung 4-1: Zwei Ebenen an Unterverzeichnissen im Verzeichnis /home/smith
Indem Sie $HOME einbeziehen, können Sie unmittelbar in eines von seinen Unterverzeichnissen springen (Family, Finances, Linux, Music und Work), ohne dass Sie den kompletten Pfad angeben müssen, auch wenn Sie sich an irgendeiner anderen Stelle im Dateisystem befinden:
$ pwd
/etc Beginnt außerhalb Ihres Home-Verzeichnisses.
$ cd Work
/home/smith/Work
$ cd Family/School Sie sind 1 Ebene unter $HOME gesprungen.
/home/smith/Family/School
Durch das Einfügen der Unterverzeichnisse von $HOME in Ihren CDPATH können Sie auf einen Schlag in deren Unterverzeichnisse springen:
$ pwd
/etc Irgendwo außerhalb Ihres Home-Verzeichnisses.
$ cd School
/home/smith/Family/School Sie sind 2 Ebenen unter $HOME gesprungen.
Alle Verzeichnisse in Ihrem CDPATH sind bisher absolute Pfade in $HOME und dessen Unterverzeichnissen. Da Sie jedoch auch den relativen Pfad .. aufgenommen haben, ermöglichen Sie ein neues cd-Verhalten in jedem Verzeichnis. Ganz egal wo Sie im Dateisystem sind, Sie können anhand des Namens in jedes Sibling-Verzeichnis (../sibling) springen, ohne die zwei Punkte eintippen zu müssen, weil cd Ihren aktuellen Parent durchsucht. Falls Sie sich zum Beispiel in /usr/bin befinden und sich nach /usr/lib begeben wollen, benötigen Sie nur cd lib:
/usr/bin Ihr aktuelles Verzeichnis
$ ls ..
bin include lib src Ihre Siblings
$ cd lib
/usr/lib Sie sind zu einem Sibling gesprungen.
Oder sollten Sie ein Programmierer sein, der an Code arbeitet, der die Unterverzeichnisses rc, include und docs hat:
$ pwd
/usr/src/myproject
$ ls
docs include src
können Sie zügig zwischen den Unterverzeichnissen hin- und herspringen:
$ cd docs Wechseln Sie Ihr aktuelles Verzeichnis.
$ cd include
/usr/src/myproject/include Sie sind zu einem Sibling gesprungen.
$ cd src
/usr/src/myproject/src Noch einmal.
Ein CDPATH für den Baum in Abbildung 4-1 könnte sechs Einträge enthalten: Ihr Home-Verzeichnis, vier seiner Unterverzeichnisse und den relativen Pfad für ein Parent-Verzeichnis:
# Setzen Sie das in eine Shell-Konfigurationsdatei und laden Sie diese:
export CDPATH=$HOME:$HOME/Work:$HOME/Family:$HOME/Linux:$HOME/Music:..
Nachdem Sie die Konfigurationsdatei geladen haben, können Sie mit cd in viele wichtige Verzeichnisse springen, ohne lange Verzeichnispfade eintippen zu müssen. Es sind nun nur noch die kurzen Verzeichnisnamen nötig. Hurra!
Diese Technik funktioniert am besten, wenn alle Unterverzeichnisse unter den CDPATH-Verzeichnissen eindeutige Namen haben. Sollten sich Namen wiederholen, wie etwa bei $HOME/Music und $HOME/Linux/Music, erzielen Sie möglicherweise nicht das gewünschte Verhalten. Der Befehl cd Music prüft immer $HOME vor $HOME/Linux und findet deshalb $HOME/Linux/Music bei der Suche nicht.
Um in den ersten zwei Ebenen von $HOME nach doppelt auftretenden Unterverzeichnisnamen zu suchen, probieren Sie diesen frechen Einzeiler aus. Er listet alle Unter- und Unterunterverzeichnisse von $HOME auf, isoliert die Unterunterverzeichnisnamen mit cut, sortiert die Liste und zählt die Vorkommen mit uniq:
$ cd
$ ls -d */ && (ls -d */*/ | cut -d/ -f2-) | sort | uniq -c | sort -nr | less
Sie kennen diese Technik zum Prüfen auf Duplikate vielleicht aus »Dateiduplikate entdecken« auf Seite 33. Wenn die Ausgabe eine Zahl anzeigt, die größer als 1 ist, haben Sie Duplikate. Ich weiß, dass dieser Befehl einige Dinge enthält, die wir noch nicht behandelt haben. Sie lernen den doppelten Ampersand (&&) in »Technik #1: Bedingte Listen« auf Seite 130 und die runden Klammern in »Technik #10: Explizite Subshells« auf Seite 151 kennen.
Gerade haben Sie gelernt, wie Sie effizient ein Verzeichnis besuchen. Jetzt zeige ich Ihnen, wie Sie schnell wieder zu einem Verzeichnis zurückkehren können.
Nehmen wir an, Sie arbeiteten in einem ganz tief gelegenen Verzeichnis und führten cd aus, um woandershin zu gehen:
$ pwd
/home/smith/Finances/Bank/Checking/Statements
$ cd /etc
Und plötzlich denken Sie: »Nein, warte, ich will zurück in das Verzeichnis Statements, in dem ich gerade war.« Tippen Sie auf keinen Fall den langen Verzeichnispfad ein, sondern führen Sie einfach cd mit einem Bindestrich als Argument aus:
$ cd -
/home/smith/Finances/Bank/Checking/Statements
Dieser Befehl bringt Ihre Shell in das vorhergehende Verzeichnis zurück und gibt dankenswerterweise auch noch dessen absoluten Pfad aus, damit Sie wissen, wo Sie sind.
Um zwischen zwei Verzeichnissen hin- und herzuspringen, führen Sie wiederholt cd - aus. Das spart unglaublich viel Zeit, wenn Sie in einer einzigen Shell in zwei Verzeichnissen gleichzeitig arbeiten müssen. Es gibt allerdings einen Haken: Die Shell erinnert sich immer nur an ein vorhergehendes Verzeichnis. Wenn Sie zum Beispiel zwischen /usr/local/bin und /etc hin- und herwechseln:
$ pwd
/usr/local/bin
$ cd /etc Die Shell erinnert sich an /usr/local/bin
$ cd - Die Shell erinnert sich an /etc
/usr/local/bin
$ cd - Die Shell erinnert sich an /usr/local/bin
/etc
und cd ohne Argumente aufrufen, um in Ihr Home-Verzeichnis zu springen:
$ cd Die Shell erinnert sich an /etc
hat die Shell /usr/local/bin als vorheriges Verzeichnis vergessen:
$ cd - Die Shell erinnert sich an Ihr Home-Verzeichnis
/etc
$ cd - Die Shell erinnert sich an /etc
/home/smith
Die nächste Technik überwindet diese Einschränkung.
Der Befehl cd - schaltet zwischen zwei Verzeichnissen hin und her. Doch was ist, wenn Sie drei oder mehr Verzeichnisse im Blick behalten wollen? Nehmen wir einmal an, Sie legten auf Ihrem Linux-Computer eine lokale Website an. Diese Aufgabe erfordert oft vier oder mehr Verzeichnisse:
Glauben Sie mir, es ist mühselig, immer wieder zu tippen:
$ cd ~/Work/Projects/Web/src
$ cd /var/www/html
$ cd /etc/apache2
$ cd ~/Work/Projects/Web/src
$ cd /etc/ssl/certs
Wenn Sie einen großen Bildschirm haben, können Sie sich die Strapazen ersparen, indem Sie für jedes Verzeichnis ein eigenes Shell-Fenster öffnen. Falls Sie aber in einer einzigen Shell arbeiten (zum Beispiel über eine SSH-Verbindung), sollten Sie eine Shell-Eigenschaft namens Verzeichnis-Stack ausnutzen. Dieser erlaubt Ihnen, ganz leicht durch mehrere Verzeichnisse zu reisen. Dazu verwendet er die eingebauten Shell-Befehle pushd, popd und dirs. Es dauert vielleicht eine Viertelstunde, das zu erlernen, und der Vorteil, den Sie damit erwerben, bleibt Ihnen für den Rest Ihrer Karriere erhalten.2
Ein Verzeichnis-Stack ist eine Liste von Verzeichnissen, die Sie in der aktuellen Shell besucht haben und die Sie weiter im Auge behalten wollen. Sie manipulieren den Stack, indem Sie zwei Operationen ausführen, die Push und Pop genannt werden. Der Push eines Verzeichnisses fügt dieses am Anfang der Liste hinzu, die traditionell als Anfang oder Top des Stacks bezeichnet werden.3 Ein Pop entfernt das oberste Verzeichnis aus dem Stack. Zu Anfang enthält der Stack nur Ihr aktuelles Verzeichnis, aber Sie können Verzeichnisse hinzufügen (Push) und entfernen (Pop) sowie mit cd zwischen ihnen wechseln.
Hinweis Jede laufende Shell führt ihren eigenen Verzeichnis-Stack. |
Ich beginne mit den Grundoperationen (Push, Pop, Betrachten) und komme dann zu dem guten Kram.
Der Befehl pushd (kurz für push directory) macht Folgendes:
Ich werde einen Verzeichnis-Stack aus vier Verzeichnissen aufbauen, indem ich diese nacheinander auf den Stack schiebe:
$ pwd
/home/smith/Work/Projects/Web/src
$ pushd /var/www/html
/var/www/html ~/Work/Projects/Web/src
$ pushd /etc/apache2
/etc/apache2 /var/www/html ~/Work/Projects/Web/src
$ pushd /etc/ssl/certs
/etc/ssl/certs /etc/apache2 /var/www/html ~/Work/Projects/Web/src
$ pwd
/etc/ssl/certs
Nach jeder pushd-Operation gibt die Shell den Stack aus. Das aktuelle Verzeichnis ist das ganz linke (oberste) Verzeichnis.
Sie geben den Verzeichnis-Stack einer Shell mit dem Befehl dirs aus. Dabei wird der Stack nicht verändert:
$ dirs
/etc/ssl/certs /etc/apache2 /var/www/html ~/Work/Projects/Web/src
Falls Sie den Stack von oben nach unten anschauen wollen, nutzen Sie die Option -p:
$ dirs -p
/etc/ssl/certs
/etc/apache2
/var/www/html
~/Work/Projects/Web/src
Sie können die Ausgabe sogar mit einer Pipeline auf den Befehl nl leiten, um die Zeilen mit null beginnend zu nummerieren:
$ dirs -p | nl -v0
0 /etc/ssl/certs
1 /etc/apache2
2 /var/www/html
3 ~/Work/Projects/Web/src
Noch einfacher: Führen Sie dirs -v aus, um den Stack mit nummerierten Zeilen auszugeben:
$ dirs -v
0 /etc/ssl/certs
1 /etc/apache2
2 /var/www/html
3 ~/Work/Projects/Web/src
Falls Sie dieses Top-down-Format künftig immer benutzen wollen, könnten Sie sich dafür einen Alias anlegen:
# Setzen Sie dies in eine Shell-Konfigurationsdatei und laden Sie sie:
alias dirs='dirs -v'
Der Befehl popd (kurz für pop directory) ist das Gegenstück zu pushd. Er macht Folgendes:
Falls Ihr Stack zum Beispiel vier Verzeichnisse enthält:
$ dirs
/etc/ssl/certs /etc/apache2 /var/www/html ~/Work/Projects/Web/src
wird ein wiederholtes Ausführen von popd die Verzeichnisse von oben bis unten durchlaufen:
$ popd
/etc/apache2 /var/www/html ~/Work/Projects/Web/src
$ popd
/var/www/html ~/Work/Projects/Web/src
$ popd
~/Work/Projects/Web/src
$ popd
bash: popd: directory stack empty
$ pwd
~/Work/Projects/Web/src
Tipp Die Befehle pushd und popd sind so effektiv, dass ich Ihnen empfehle, Aliase aus zwei Buchstaben für sie anzulegen, damit sie genauso schnell getippt werden können wie cd: |
|
|
# Setzen Sie das in eine Shell-Konfigurationsdatei # und laden Sie sie: alias gd=pushd alias pd=popd |
Sie können nun also den Verzeichnis-Stack aufbauen und wieder leeren. Schauen wir uns jetzt einige praktische Anwendungsfälle an. pushd ohne Argumente vertauscht die obersten beiden Verzeichnisse und navigiert zum neuen obersten Verzeichnis. Springen wir mehrmals zwischen /etc/apache2 und Ihrem Arbeitsverzeichnis hin und her, indem wir einfach pushd ausführen. Sie sehen, dass das dritte Verzeichnis /var/www/html an seiner Position im Stack bleibt, während die ersten beiden Verzeichnisse die Positionen tauschen:
$ dirs
/etc/apache2 ~/Work/Projects/Web/src /var/www/html
$ pushd
~/Work/Projects/Web/src /etc/apache2 /var/www/html
$ pushd
/etc/apache2 ~/Work/Projects/Web/src /var/www/html
$ pushd
~/Work/Projects/Web/src /etc/apache2 /var/www/html
Der Befehl pushd verhält sich ähnlich wie cd -, wechselt also zwischen zwei Verzeichnissen, allerdings hat er nicht die Beschränkung, sich immer nur ein Verzeichnis merken zu können.
Nehmen wir einmal an, dass Sie mit pushd zwischen mehreren Verzeichnissen hin und her springen. Plötzlich führen Sie versehentlich stattdessen cd aus und verlieren ein Verzeichnis:
$ dirs
~/Work/Projects/Web/src /var/www/html /etc/apache2
$ cd /etc/ssl/certs
$ dirs
/etc/ssl/certs /var/www/html /etc/apache2
Hoppla, der versehentliche cd-Befehl hat ~/Work/Projects/Web/src im Stack durch /etc/ssl/certs ersetzt. Aber keine Panik. Sie können das verloren gegangene Verzeichnis wieder auf den Stack packen, ohne dessen langen Pfad eintippen zu müssen. Führen Sie zweimal pushd aus, einmal mit dem Bindestrich als Argument und einmal ohne:
$ pushd -
~/Work/Projects/Web/src /etc/ssl/certs /var/www/html /etc/apache2
$ pushd
/etc/ssl/certs ~/Work/Projects/Web/src /var/www/html /etc/apache2
Schauen wir uns genau an, wieso das funktioniert:
Dieser »Hoppla, ich habe ein pushd vergessen«-Befehl ist so nützlich, dass er einen eigenen Alias verdient. Ich selbst nenne ihn slurp (schlürfen), weil er (zumindest in meiner Vorstellung) ein Verzeichnis »zurückschlürft«, das ich versehentlich verloren habe:
# Setzen Sie dies in eine Shell-Konfigurationsdatei und laden Sie sie:
alias slurp='pushd - && pushd'
Was ist, wenn Sie mit cd zwischen anderen als den obersten beiden Verzeichnissen im Stack wechseln wollen? pushd und popd akzeptieren ein positives oder negatives Integer-Argument, um weiter in den Stack einzutauchen. Der Befehl:
$ pushd +N
verschiebt N Verzeichnisse vom Anfang des Stacks (also von oben) an das Ende (also nach unten) und führt dann ein cd an das neue oberste Verzeichnis aus. Ein negatives Argument (-N) verschiebt Verzeichnisse in die entgegengesetzte Richtung, also von unten nach oben, bevor cd ausgeführt wird.4
$ dirs
/etc/ssl/certs ~/Work/Projects/Web/src /var/www/html /etc/apache2
$ pushd +1
~/Work/Projects/Web/src /var/www/html /etc/apache2 /etc/ssl/certs
$ pushd +2
/etc/apache2 /etc/ssl/certs ~/Work/Projects/Web/src /var/www/html
Auf diese Weise können Sie mit einem einfachen Befehl zu jedem anderen Verzeichnis im Stack springen. Falls Ihr Stack jedoch sehr lang ist, könnte es schwierig sein, die numerische Position eines bestimmten Verzeichnisses abzuschätzen. Geben Sie also mit dirs -v diese numerischen Positionen aus, wie Sie es in »Betrachten eines Verzeichnis-Stacks« auf Seite 80 gemacht haben:
$ dirs -v
0 /etc/apache2
1 /etc/ssl/certs
2 ~/Work/Projects/Web/src
3 /var/www/html
Um /var/www/html im Stack ganz nach oben zu verschieben (und damit zu Ihrem aktuellen Verzeichnis zu machen), führen Sie pushd +3 aus.
Um zum Verzeichnis ganz unten im Stack zu springen, führen Sie pushd -0 (Bindestrich null) aus:
/etc/apache2 /etc/ssl/certs ~/Work/Projects/Web/src /var/www/html
$ pushd -0
/var/www/html /etc/apache2 /etc/ssl/certs ~/Work/Projects/Web/src
Sie können auch Verzeichnisse jenseits des obersten Verzeichnisses aus dem Stack entfernen, indem Sie popd mit einem numerischen Argument benutzen. Der Befehl:
$ popd +N
entfernt das Verzeichnis an Position N aus dem Stack. Gezählt wird hierbei von oben. Ein negatives Argument (-N) zählt stattdessen von unten im Stack nach oben. Das Zählen beginnt bei null; popd +1 entfernt also das zweite Verzeichnis von oben:
$ dirs
/var/www/html /etc/apache2 /etc/ssl/certs ~/Work/Projects/Web/src
$ popd +1
/var/www/html /etc/ssl/certs ~/Work/Projects/Web/src
$ popd +2
/var/www/html /etc/ssl/certs
Alle Techniken in diesem Kapitel sind mit ein bisschen Übung leicht zu verstehen und ersparen Ihnen eine Menge Zeit und Arbeit beim Tippen. Ich persönlich finde diese Techniken besonders nützlich: