По-разному. В 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
настоящее время рабочий каталог считается верхним элементом стека каталогов. The man 1 bash
говорит:
pushd [-n] [dir]
[…] Добавляет dir
в стек каталогов вверху, делая его новым текущим рабочим каталогом, как если бы он был предоставлен в качестве аргумента для cd
встроенной функции. [...]
Печать DIRSTACK
( echo ${dirstack[@]}
) подтверждает, что первый элемент идентичен $PWD
.
В zsh
настоящее время рабочий каталог не является частью стека каталогов (но все равно показан с помощью dirs
). man 1 zshbuiltins
говорит:
pushd [ -qsLP ] [ arg ]
[…] Измените текущий каталог и поместите старый текущий каталог в стек каталогов. В первой форме измените текущий каталог на arg. [...]
Печать 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
параметр.
Для большего количества вариантов посмотрите руководство .
cd
устанавливает переменную оболочкиOLDPWD
в предыдущий каталог иcd -
переводится вcd "$OLDPWD"
.