Есть ли разница между поведением pushd / popd в bash и zsh? Похоже, в zsh cd, cd ведет себя точно так же, как pushd / popd (который автоматически добавляет / pops каталог, когда cd), тогда как в bash cd не влияет на стек dir.
Если кто-то может дать мне указатель, это было бы здорово.
bash
zsh
cd-command
pushd
dragonxlwang
источник
источник
cd
устанавливает переменную оболочкиOLDPWD
в предыдущий каталог иcd -
переводится вcd "$OLDPWD"
.pushd
также устанавливаетOLDPWD
dirs
всегда держит PWD в качестве первого элементаОтветы:
По-разному. В
zsh
вы можете настроить ,cd
чтобы нажать на старый каталог на каталог стека автоматически, но это не по умолчанию.Насколько я могу судить,
zsh
настройки по умолчанию ведут себя очень похоже наbash
:cd somedir
somedir
OLDPWD
PWD="somedir"
dirs
) наsomedir
(количество элементов в стеке не меняется).cd -
:$OLDPWD
PWD
иOLDPWD
PWD
pushd somedir
:somedir
OLDPWD
PWD="somedir"
somedir
в стек каталога (расширяя его на один элемент)popd
:OLDPWD
PWD
новый верхний элемент стека каталоговПримечание: считается ли текущий рабочий каталог элементом стека каталогов, отличается от
zsh
иbash
. Я использовал вbash
качестве ссылки для приведенных выше списков.В
bash
настоящее время рабочий каталог считается верхним элементом стека каталогов. Theman 1 bash
говорит:Печать
DIRSTACK
(echo ${dirstack[@]}
) подтверждает, что первый элемент идентичен$PWD
.В
zsh
настоящее время рабочий каталог не является частью стека каталогов (но все равно показан с помощьюdirs
).man 1 zshbuiltins
говорит:Печать
dirstack
(echo ${dirstack[@]}
) и сравнение ее с выводом командыdirs
должны показать, чтоPWD
она не является частью `dirstack.В обеих оболочках
dirs
печатается текущий рабочий каталог как первый элемент. Также в обеих оболочках элемент стека каталога с индексом1
относится к каталогу, который был текущим до последнегоpushd
. Это потому, что массивы вzsh
обычно нумеруются из1
, в то время как они нумеруются из0
вbash
. Таким образом, есть небольшая практическая разницаКак сказано выше, это поведение может быть изменено в
zsh
.Если вы устанавливаете
AUTO_PUSHD
опцию вzsh
(setopt autopushd
)cd somedir
ведет себя какpushd somedir
, предыдущий каталог автоматически помещается в стек каталогов. Это, вероятно, случай на вашей машине. Вы можете запустить,setopt
чтобы получить список параметров, которые не установлены по умолчанию. Видите,autopushd
появляется ли в списке.Но это не меняет
cd -
поведениеpopd
. Вместо этого он просто помещается$PWD
в стек каталогов и меняет каталог на$OLDPWD
. Это означает, что повторные вызовы наcd -
самом деле увеличивают стек каталогов (($PWD $OLDPWD $PWD $OLDPWD $PWD …)
). Если он действительно ведет себя так же, какpopd
в вашей системе, я бы предложил, еслиcd
это на самом деле встроенный (whence -v cd
); возможно, его заменили псевдонимом или функцией.Поскольку стек каталогов будет довольно быстро расти при
AUTO_PUSHD
включенном, вы можете ограничить его размер, установив для параметраDIRSTACKSIZE
желаемый максимальный размер.Вы также можете предотвратить дублирование, установив
PUSHD_IGNORE_DUPS
параметр.Для большего количества вариантов посмотрите руководство .
источник
dirs
?popd
без необходимости набирать (или даже знать) путь.