pushd, popd vs cd, cd-in bash und zsh

16

Gibt es einen Unterschied zwischen dem Verhalten von pushd / popd in bash und zsh? Es scheint, dass in zsh cd cd- sich genauso verhält wie pushd / popd (das bei cd automatisch das Verzeichnis / pops hinzufügt), während in bash cd den dir-Stack nicht beeinflusst.

Wenn mir jemand einen Hinweis geben kann, wäre das großartig.

dragonxlwang
quelle
Ich kann nur mit bash sprechen: using cdsetzt die Shell-Variable OLDPWDauf das vorherige Verzeichnis und cd -wird in übersetzt cd "$OLDPWD".
Glenn Jackman
@glennjackman, danke. Bedeutet das, dass in bash cd nichts mit pushd / popd zu tun hat?
Dragonxlwang
Ich habe gerade nachgesehen und pushdauch eingestelltOLDPWD
Glenn Jackman
Und der Dirstack, der von zurückgegeben wird, enthält dirsimmer die PWD als erstes Element
Glenn Jackman,
ja, aber es ist auch sehr sinnvoll, wenn cd dir stacks nicht berührt, was von pushd / popd in bash verwaltet wird.
Dragonxlwang

Antworten:

17

Es hängt davon ab, ob. In können zshSie konfigurieren cd, dass das alte Verzeichnis automatisch auf den Verzeichnisstapel verschoben wird, dies ist jedoch nicht die Standardeinstellung.

Soweit ich zshmit Standardeinstellungen feststellen kann, verhält sich das sehr ähnlich wie bash:

  • cd somedir
    • Verzeichnis wechseln zu somedir
    • Speichern Sie das ursprüngliche Verzeichnis in OLDPWD
    • einstellen PWD="somedir"
    • Ersetzen Sie das oberste Element des Verzeichnisstapels (wie durch dargestellt dirs) durch somedir(die Anzahl der Elemente auf dem Stapel ändert sich nicht).
  • cd -:
    • Verzeichnis wechseln zu $OLDPWD
    • Swap-Werte von PWDundOLDPWD
    • Ändern Sie das oberste Element des Verzeichnisstapels, um es wiederzugeben (das neue). PWD
  • pushd somedir:
    • Verzeichnis wechseln zu somedir
    • Originalverzeichnis speichern in OLDPWD
    • einstellen PWD="somedir"
    • somedirauf den Verzeichnisstack schieben (um ein Element erweitern)
  • popd:
    • Originalverzeichnis speichern in OLDPWD
    • Entfernen Sie das erste Element des Verzeichnisstapels
    • Wechseln Sie in das neue oberste Element des Verzeichnisstapels
    • setzt PWDauf das neue Top-Element des Verzeichnisstapels

Hinweis: Ob das aktuelle Arbeitsverzeichnis als Element des Verzeichnisstapels betrachtet wird, unterscheidet sich zwischen zshund bash. Ich habe bashals Referenz für die obigen Listen verwendet.

  • Im bashvorliegenden Arbeitsverzeichnis gilt es als oberstes Element des Verzeichnisstapels. Der man 1 bashsagt:

    pushd [-n] [dir]

    […] Fügt dires dem Verzeichnisstapel oben hinzu und macht es zum neuen aktuellen Arbeitsverzeichnis, als ob es als Argument für das cdeingebaute Verzeichnis angegeben worden wäre. […]

    Durch Drucken von DIRSTACK( echo ${dirstack[@]}) wird bestätigt, dass das erste Element mit identisch ist $PWD.

  • Im zshjetzigen Arbeitsverzeichnis ist es nicht Teil des Verzeichnisstacks (wird aber trotzdem mit angezeigt dirs). man 1 zshbuiltinssagt:

    pushd [ -qsLP ] [ arg ]

    […] Ändern Sie das aktuelle Verzeichnis und verschieben Sie das alte aktuelle Verzeichnis in den Verzeichnisstapel. Ändern Sie im ersten Formular das aktuelle Verzeichnis in arg. […]

    Drucken dirstack( echo ${dirstack[@]}) und Vergleichen mit der Ausgabe von dirssollte zeigen, dass das PWDnicht Teil von `dirstack ist.

In beiden Shells wird dirsdas aktuelle Arbeitsverzeichnis als erstes Element gedruckt. Auch in beiden Shells 1verweist das Verzeichnisstapelelement mit dem Index auf das Verzeichnis, das vor dem letzten aktuell war pushd. Das liegt daran, dass Arrays in zshnormalerweise von nummeriert werden 1, während sie von 0in nummeriert werden bash. Es gibt also kaum einen praktischen Unterschied


Wie oben erwähnt, kann dieses Verhalten in geändert werden zsh.

Wenn Sie die eingestellte AUTO_PUSHDOption zsh( setopt autopushd) cd somedirverhält sich wie pushd somedirwird das vorherige Verzeichnis auf das Verzeichnis - Stack automatisch geschoben. Dies ist wahrscheinlich auf Ihrem Computer der Fall. Sie können ausführen setopt, um eine Liste der Optionen abzurufen, die nicht standardmäßig festgelegt sind. Prüfen Sie, ob autopushdin der Liste angezeigt wird.

Dies ändert sich aber nicht, um sich so cd -zu verhalten popd. Stattdessen wird einfach $PWDauf den Verzeichnisstapel geschoben und das Verzeichnis in geändert $OLDPWD. Das bedeutet, dass durch wiederholtes Aufrufen cd -der Verzeichnisstapel ( ($PWD $OLDPWD $PWD $OLDPWD $PWD …)) vergrößert wird . Wenn es sich tatsächlich genauso verhält wie popdauf Ihrem System, würde ich vorschlagen, ob cdes sich tatsächlich um das builtin ( whence -v cd) handelt. Möglicherweise wird es durch einen Alias ​​oder eine Funktion ersetzt.

Da der Verzeichnisstapel bei AUTO_PUSHDaktivierter Option relativ schnell wächst , können Sie seine Größe begrenzen, indem Sie den Parameter DIRSTACKSIZEauf die gewünschte maximale Größe einstellen .
Sie können Duplikate auch verhindern, indem Sie die PUSHD_IGNORE_DUPSOption aktivieren.
Weitere Optionen finden Sie im Handbuch .

Adaephon
quelle
Was ist der andere Zweck des Verzeichnisstapels als dessen Anzeige dirs?
Xerus
@Xerus Ermöglicht das Zurückkehren zu zuvor besuchten Verzeichnissen, popdohne den Pfad eingeben (oder gar kennen zu müssen).
Adaephon