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.
bash
zsh
cd-command
pushd
dragonxlwang
quelle
quelle
cd
setzt die Shell-VariableOLDPWD
auf das vorherige Verzeichnis undcd -
wird in übersetztcd "$OLDPWD"
.pushd
auch eingestelltOLDPWD
dirs
immer die PWD als erstes ElementAntworten:
Es hängt davon ab, ob. In können
zsh
Sie konfigurierencd
, dass das alte Verzeichnis automatisch auf den Verzeichnisstapel verschoben wird, dies ist jedoch nicht die Standardeinstellung.Soweit ich
zsh
mit Standardeinstellungen feststellen kann, verhält sich das sehr ähnlich wiebash
:cd somedir
somedir
OLDPWD
PWD="somedir"
dirs
) durchsomedir
(die Anzahl der Elemente auf dem Stapel ändert sich nicht).cd -
:$OLDPWD
PWD
undOLDPWD
PWD
pushd somedir
:somedir
OLDPWD
PWD="somedir"
somedir
auf den Verzeichnisstack schieben (um ein Element erweitern)popd
:OLDPWD
PWD
auf das neue Top-Element des VerzeichnisstapelsHinweis: Ob das aktuelle Arbeitsverzeichnis als Element des Verzeichnisstapels betrachtet wird, unterscheidet sich zwischen
zsh
undbash
. Ich habebash
als Referenz für die obigen Listen verwendet.Im
bash
vorliegenden Arbeitsverzeichnis gilt es als oberstes Element des Verzeichnisstapels. Derman 1 bash
sagt:Durch Drucken von
DIRSTACK
(echo ${dirstack[@]}
) wird bestätigt, dass das erste Element mit identisch ist$PWD
.Im
zsh
jetzigen Arbeitsverzeichnis ist es nicht Teil des Verzeichnisstacks (wird aber trotzdem mit angezeigtdirs
).man 1 zshbuiltins
sagt:Drucken
dirstack
(echo ${dirstack[@]}
) und Vergleichen mit der Ausgabe vondirs
sollte zeigen, dass dasPWD
nicht Teil von `dirstack ist.In beiden Shells wird
dirs
das aktuelle Arbeitsverzeichnis als erstes Element gedruckt. Auch in beiden Shells1
verweist das Verzeichnisstapelelement mit dem Index auf das Verzeichnis, das vor dem letzten aktuell warpushd
. Das liegt daran, dass Arrays inzsh
normalerweise von nummeriert werden1
, während sie von0
in nummeriert werdenbash
. Es gibt also kaum einen praktischen UnterschiedWie oben erwähnt, kann dieses Verhalten in geändert werden
zsh
.Wenn Sie die eingestellte
AUTO_PUSHD
Optionzsh
(setopt autopushd
)cd somedir
verhält sich wiepushd somedir
wird das vorherige Verzeichnis auf das Verzeichnis - Stack automatisch geschoben. Dies ist wahrscheinlich auf Ihrem Computer der Fall. Sie können ausführensetopt
, um eine Liste der Optionen abzurufen, die nicht standardmäßig festgelegt sind. Prüfen Sie, obautopushd
in der Liste angezeigt wird.Dies ändert sich aber nicht, um sich so
cd -
zu verhaltenpopd
. Stattdessen wird einfach$PWD
auf den Verzeichnisstapel geschoben und das Verzeichnis in geändert$OLDPWD
. Das bedeutet, dass durch wiederholtes Aufrufencd -
der Verzeichnisstapel (($PWD $OLDPWD $PWD $OLDPWD $PWD …)
) vergrößert wird . Wenn es sich tatsächlich genauso verhält wiepopd
auf Ihrem System, würde ich vorschlagen, obcd
es 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_PUSHD
aktivierter Option relativ schnell wächst , können Sie seine Größe begrenzen, indem Sie den ParameterDIRSTACKSIZE
auf die gewünschte maximale Größe einstellen .Sie können Duplikate auch verhindern, indem Sie die
PUSHD_IGNORE_DUPS
Option aktivieren.Weitere Optionen finden Sie im Handbuch .
quelle
dirs
?popd
ohne den Pfad eingeben (oder gar kennen zu müssen).