Linux im GriffOffice & Business

Spaß mit dem Directory Stack :)

Der Directory Stack ist wohl eher ein Bash-Stiefkind, kann aber eine Menge Zeit und Nerven sparen.

Wenn Ihr auf der Kommandozeile häufig zwischen Ordnern hin- und herspringen müsst, solltet Ihr Euch den Directory Stack, kurz Dir-Stack mal anschauen. Mit diesem netten Konzept und drei eingebauten Tools könnt Ihr quasi temporäre Shortcuts zu diesen Ordnern nutzen. Oder auch Skripte ohne instabile Anweisungen der Art cd ../../../../ schreiben. Das ist nichts für Jedermann, aber ein netter kleiner Mini-Mindfuck mit Spaß und Nutzen!

Was kann das?

Bevor es an die Umsetzung und Tools geht, zunächst mal ein Beispiel, um das Ganze etwas greifbarer zu machen. Angenommen, Ihr arbeitet im Terminal an einer Studienarbeit: Die Arbeit liegt in Eurem Heimverzeichnis unter ~/arbeit. Darin gibt es folgende Verzeichnisstruktur:

├ arbeit ├── bilder │   ├── abfall │   ├── quellen │   └── test │   └── foobar ├── stats │   ├── abfall │   ├── quellen │   └── test │   └── foobar └── texte ├── abfall ├── quellen └── test └── foobar

Wenn Ihr nun Arbeiten an all Euren Quellen, egal welchen Inhalts, arbeitet und mal hier mal da seid, könnte Eure Navigation so aussehen - mit einem Ausflug nach foobar:

cd arbeit/bilder/quellen
cd ../../texte/quellen
cd ../../stats/quellen
cd ../../texte/test/foobar
cd ../../../text/quellen
...

Oder Ihr seid in arbeit und woll nur mal kurz ein Skript in foobar ausführen und dann wieder zurück:

cd texte/test/foobar
./irgendeinskript.sh
cd ../../../

Das ist alles nicht hübsch, richtig? Wieviele ../ mussten es gleich sein? Nun, es gibt viele Möglichkeiten, das Ganze etwas hübscher zu gestalten, beispielsweise Aliasse, Subshells oder die History . Oder der Befehl cd -, der zurück ins vorige Verzeichnis führt - quasi ein undo/rückgängig. Hier soll es aber nun der Dir-Stack sein - und da sieht der erste Fall dann später so aus:

cd ~1
cd ~3
cd ~2
cd ~4
cd ~3
...

Und der zweite Fall:

pushd texte/test/foobar
./irgendeinskript.sh
popd

Das ist doch schon etwas übersichtlicher, gell?

Dir-Stack in der Praxis

Der Dir-Stack ist nichts weiter als eine Liste besuchter Verzeichnisse. Wenn Ihr ein Verzeichnis mit cd betretet, besteht der Stapel ausschließlich aus dem aktuellen Verzeichnis - was der Befehl dirs zeigt:

~$ cd arbeit/bilder
~/bilder$ dirs
~/bilder$ ~/arbeit/bilder

Blöder "Stapel" ... Mit dem Befehl pushd wird genauso wie mit cd ein Verzeichnis betreten, aber zusätzlich zum Stapel hinzugefügt - und zwar wie sich das für einen Stapel gehört oben, beziehungsweise links:

~$ pushd arbeit
~/arbeit$ dirs
~/arbeit ~

dirs gibt nun links das betretene Verzeichnis (arbeit) aus und danach das Verzeichnis, aus dem Ihr kamt, also ~. Deutlicher wird es mit etwas mehr Details:

~/arbeit$ dirs -v
 0 ~/arbeit
 1 ~

So sieht es schon stapeliger aus - und Ihr seht die Nummerierung! Achtet darauf, dass sie mit 0 anfängt, das ist später noch wichtig.

Zunächst aber: Stapel abbauen:

~/arbeit$ popd
~/$ dirs -v
  0 ~

Ihr landet also wieder im Heimverzeichnis ~ und arbeit wurde vom Stapel genommen. Und damit ist das zweite Beispiel von oben bereits erledigt. Praktisch ist das zum Beispiel, wenn Ihr die meiste Zeit in arbeit seid und ab und an mal in andere Verzeichnisse irgendwo auf der Festplatte wechseln müsst. Statt ../-Orgien genügt ein popd, um zu arbeit zurückzukehren.

Navigation aufbauen

Nochmal zur Nummerierung: Das Schöne daran ist, dass Ihr Verzeichnisse über ihre Nummern ansprechen könnt. Baut also zunächst Euren Stapel mit den drei quellen-Verzeichnissen auf:

~/arbeit$ pushd bilder/quellen
~/arbeit/bilder/quellen$ pushd ../../stats/quellen
~/arbeit/stats/quellen$ pushd ../../texte/quellen
~/arbeit/stats/quellen$ pushd ../../
~/arbeit/$ dirs -v
 0 ~/arbeit
 1 ~/arbeit/bilder/quellen
 2 ~/arbeit/stats/quellen
 3 ~/arbeit/text/quellen
 4 ~/arbeit

Der letzte pushd-Befehl hat letztlich nochmal das Verzeichnis arbeit oben auf den Stapel gelegt, damit keines der quellen-Verzeichnisse die Nummer 0 hat - das ist wichtig! Denn dieser oberste Eintrag wird vom cd-Kommando auf das aktuelle Verzeichnis gesetzt - ist ja auch klar: cd steht für change directory - es ändert den obersten Verzeichniseintrag. pushd steht für push directory und schubst entsprechend einen neuen Eintrag auf den Stapel. Und wo hinzugefügt und ersetzt werden kann, kann auch gelöscht werden. Wenn Ihr mal einen bestimmten Eintrag aus der Liste entfernen wollt:

~/arbeit/$ popd -2

Mit - zählt Ihr von unten, mit + von oben - entsprechend ließe sich hier stats/quellen mit popd -2 und auch mit popd +2 entfernen; Standardargument ist +0, es wird also das vorige Verzeichnis betreten und das Verlassene vom Stapel entfernt.

Ändern (cd), Hinzufügen (pushd), Entfernen (popd) - klingt plötzlich nach einem durchaus bekannten Konzept, gell?!

Soviel zum Verständnis, nun zum Spaß: Ab jetzt könnt Ihr mit dem normalen cd-Befehl zwischen den Verzeichnissen wechseln, ohne den Stapel zu verändern! Also zum Beispiel mal von arbeit über texte/quellen über stats/quellen über bilder/quellen und letztlich zurück nach arbeit:

~/$cd ~4
~/$cd ~3
~/$cd ~2
~/$cd ~1
~/$cd ~4

Wenn Ihr zwischendurch mal dirs laufen lasst seht Ihr, dass sich nur der oberste Eintrag Nummer 0 des Stapels ändert.

Und natürlich funktioniert auch sowas wie

ls ~0
tree ~3

und so weiter.

Scripting

Der Vorteil beim Scripting ist eher subtil und kann Euch vor allem vor Fehlern bewahren. Stellt Euch ein simples Skript in ~/testing/ vor, das in diversen Ordnern arbeitet:

cd ordner1/verzeichnis/nummer3/irgendwas/foo/bar
./bar.sh
mv bar-output.txt > /tmp
echo foobar
ls
ping google.de
echo langweilig | cowsay
fortune
sleep 20
echo Zeit zurück zu gehen!
cd ../../../../../

Das letzte cd ist eh schon eine Zumutung, aber stellt Euch mal vor, Ihr ändert das obere cd etwa zu cd /ordner/foo/bar weil Ihr merkt, dass die Struktur schwachsinnig ist - denkt Ihr auch daran, das untere cd zu aktualisieren? Auch wenn dazwischen 3.000 Zeilen Code liegen? Und wie viele Stufen müssen gleich entfernt werden?

Es ist einfach fehleranfällig. Wenn Ihr stattdessen pushd/popd nutzt, landet Ihr garantiert wieder im Ausgangsordner und müsst an dieser Stelle nie wieder etwas nach-aktualisieren. Anders ausgedrückt: Ihr nutzt quasi relative statt absoluter Angaben.

Hilfe im Terminal

So ein Artikel ist schön und gut, aber wenn Ihr sowas mal braucht, seid Ihr eben irgendwo auf der Kommandozeile - und habt vielleicht gar keinen Browser zur Verfügung. Und selbst wenn: Wechseln ist lästig, nebeneinander ist lästig, die Website raussuchen ist lästig ... Ihr könnt Hilfe dazu aber auch direkt im Terminal abrufen:

curl cli.help/dirstack

cli.help ist unsere hauseigene Linux-Hilfe für Kommandozeilen-Tools. Mehr dazu gibt's auch auf GitHub oder

curl cli.help
curl cli.help/hilfe
curl cli.help/befehle
curl cli.help/alles

Das letzte Update gab es hier. Und wenn es noch mehr CLI-Spaß sein soll - gerne ...

Mirco Lang

Freier Journalist, Exil-Sauerländer, (ziemlich alter) Skateboarder, Dipl.-Inf.-Wirt, Einzelhandelskaufmann, Open-Source-Nerd, Checkmk-Handbuchschreiber. Ex-Saturn'ler, Ex-Data-Becker'ler, Ex-BSI'ler. Computer-Erstkontakt: ca. 1982 - der C64 des großen Bruders eines Freunds. Wenn Ihr hier mehr über Open Source, Linux und Bastelkram lesen und Tutonaut unterstützen möchtet: Über Kaffeesponsoring via Paypal.freue ich mich immer. Schon mal im Voraus: Danke! Nicht verpassen: cli.help und VoltAmpereWatt.de. Neu: Mastodon

Ein Kommentar

Schreibe einen Kommentar

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

Schaltfläche "Zurück zum Anfang"