Linux’ pushd

Von in linux

Linux bie­tet für die Kon­so­le eine Viel­zahl nütz­li­cher Befeh­le und Werk­zeu­ge. Man­che sind essen­ti­ell, ande­re erleich­tern nur die Arbeit, eini­ge sind selbst­er­klä­rend, ande­re wie­der­um etwas kom­ple­xer. Einen viel­leicht nicht so bekann­ten Ver­tre­ter, des­sen Funk­tio­na­li­tät ich aber schät­zen gelernt habe, möch­te ich hier vor­stel­len; zum Ken­nen­ler­nen und Aus­pro­bie­ren, Erin­nern oder ein­fach nur zum Nachlesen.

Das Wech­seln in diver­se Ver­zeich­nis­se wird durch die Auto­ver­voll­stän­di­gung mit­tels Tab-​Taste bereits wesent­lich erleich­tert. Hat man aber zum Bei­spiel viel Kopier­ar­beit zu erle­di­gen und muss stän­dig zwi­schen Ord­nern, mög­li­cher­wei­se auch in tie­fe Pfa­de, wech­seln, böte sich eine Funk­ti­on an, die bereits besuch­te Ver­zeich­nis­se spei­cher­te und einen erneu­ten schnel­len Zugriff ermög­li­chen wür­de. Hier­für gibt es den Befehl pushd, mit sei­nen Hel­fern popd und dirs. Ich wür­de deren Funk­tio­na­li­tät mit den Rei­tern von Nau­ti­lus ver­glei­chen, die auch ein schnel­les Wech­seln zwi­schen bereits auf­ge­ru­fe­nen Ver­zeich­nis­sen und, um beim Bei­spiel des Kopie­rens zu blei­ben, ein schnel­les Arbei­ten ermög­li­chen. pushd ist aller­dings kein Befehl, den man empi­risch in sein Reper­toire auf­nimmt. Da sind schon ein paar Erklä­run­gen erforderlich.

pushd ähnelt gewis­ser­ma­ßen dem Befehl cd und auf den ers­ten Blick ist nur ein klei­ner Unter­schied zu erkennen:

~ $ cd /var/log/
/var/log $ cd /usr/share/
/usr/share $ cd ~
~ $ pushd /var/log/
/var/log ~
/var/log $ pushd /usr/share/
/usr/share /var/log ~
/usr/share $ pushd ~
~ /usr/share /var/log ~
~ $

Denn noch bevor in das ange­ge­be­ne Ver­zeich­nis gewech­selt wird, gibt pushd eine knap­pe Infor­ma­ti­on über die gespei­cher­ten Ver­zeich­nis­wech­sel aus. Dabei wird fol­gen­der­ma­ßen vor­ge­gan­gen: Ähn­lich einem Kar­ten­sta­pel wer­den neu hin­zu­ge­füg­te Ver­zeich­nis­se auf den Sta­pel gelegt. Zum bes­se­ren Ver­ständ­nis füh­ren wir den Befehl dirs aus (mit dem Argu­ment “-v”, der das Ergeb­nis anschau­li­cher macht):

~ $ dirs -v
0 ~
1 /usr/share
2 /var/log
3 ~
~ $

Dabei zeigt uns dirs den Zustand unse­res “Kar­ten­sta­pels”. Es ist auch erkenn­bar, dass das aktu­el­le Ver­zeich­nis, auch wenn man anstatt pushd cd ver­wen­det hat, immer an ers­ter Stel­le steht. Es ist also nicht erfor­der­lich, den momen­tan gül­ti­gen Pfad “extra” zu spei­chern. Die Zah­len vor den Ver­zeich­nis­sen ermög­li­chen nun einen direk­ten Zugriff auf das jewei­li­ge Ver­zeich­nis (wobei zu beach­ten ist, dass der Sta­pel “null-​indiziert” ist, also bei 0 beginnt). Wir befin­den uns also gera­de im User-​Verzeichnis und möch­ten zurück ins log-Verzeichnis:

~ $ pushd +2
/var/log ~ ~ /usr/share
/var/log $

Dabei wur­de die Kar­te mit dem Index 2, näm­lich /​var/​log, aus dem Sta­pel gezo­gen und wie­der ganz nach oben gelegt. Aber! pushd bringt hier nicht nur die auf­ge­ru­fe­ne “Kar­te” im Sta­pel nach oben, son­dern auch alle dar­un­ter lie­gen­den. In ande­ren Wor­ten: Heißt die Rei­hen­fol­ge zuerst 0-​1-​2-​3 und es wird der Index 2 auf­ge­ru­fen, lau­tet die Rei­hen­fol­ge danach 2-3-0-1:

/var/log $ dirs -v
0  /var/log
1 ~
2 ~
3  /usr/share

Der Befehl pushd +2 bedeu­tet also, dass der Index 2 auf­ge­ru­fen wer­den soll. Wir hät­ten aber auch pushd -1 ein­ge­ben kön­nen, was zum sel­ben Ergeb­nis geführt hät­te. pushd hät­te dann ein­fach von unten gezählt. pushd lässt sich aber auch ohne Argu­men­te ein­set­zen. Dabei wer­den dann ein­fach nur die ers­ten bei­den Ein­trä­ge aus dem Sta­pel ver­tauscht. Aus 0-​1-​2-​3 wird 1-​0-​2-​3. Nun wird schon jeder bemerkt haben, dass sich ein nicht son­der­lich sinn­vol­ler Ein­trag in unse­rem Sta­pel befin­det: Unser User-​Verzeichnis ist dop­pelt abge­bil­det. Nicht, dass sich des­we­gen die Welt auf­hör­te zu dre­hen, es könn­te unter Umstän­den aber trotz­dem sinn­voll sein, Ein­trä­ge aus dem Sta­pel wie­der zu ent­fer­nen. Damit wären wir auch schon beim letz­ten Befehl:

/var/log $ popd +1
/var/log ~ /usr/share
/var/log $ dirs -v
0 /var/log
1 ~
2 /usr/share
/var/log $

popd ent­fernt also Ein­trä­ge aus dem Sta­pel, ver­lässt aber das der­zei­ti­ge Ver­zeich­nis nicht.

Das schnel­le Wech­seln in tem­po­rär gespei­cher­ten Pfa­den ist schon sehr bequem. Es bie­tet sich aber eine noch prak­ti­sche­re Anwen­dung an, denn die Funk­ti­on von pushd lässt sich mit ande­ren Befeh­len kombinieren:

mv testfile.txt ~+2

Tat­säch­lich wur­de das File testfile.txt in den Ord­ner /​usr/​share/​ ver­scho­ben. Die Syn­tax hier­für ist lei­der etwas ver­wir­rend, steht die Til­de schließ­lich auch für den User-​Ordner. Hier wird sie jedoch ohne Abstand dem Index vorangestellt.

pushd: Ein nicht essen­ti­el­ler Befehl, aber, sehr prak­tisch. Ein­fach ein­mal ausprobieren!

Share on LinkedInShare on Redditshare on TumblrShare on StumbleUponDigg thisShare on FacebookGoogle+Tweet about this on TwitterEmail to someone