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

Есть ли разница между поведением pushd /popd в bash vs zsh? Кажется, что в zsh cd cd ведет себя точно так же, как pushd /popd (который автоматически добавляет каталог /pops при cd), а в bash cd не влияет на стек dir.

Если кто-то может дать мне указатель, который будет большим.

10 голосов | спросил dragonxlwang 29 MarpmTue, 29 Mar 2016 23:19:47 +03002016-03-29T23:19:47+03:0011 2016, 23:19:47

1 ответ


14

Это зависит. В zsh вы можете настроить cd, чтобы нажать старый каталог в стеке каталога автоматически, но это не значение по умолчанию.

Насколько я могу судить, zsh с настройками по умолчанию ведет себя очень похоже на bash:

  • cd somedir
    • сменить каталог на somedir
    • сохранить исходный каталог в OLDPWD
    • set PWD="somedir"
    • заменить верхний элемент стека каталога (как показано dirs) с помощью somedir (количество элементов в стеке не изменяется).
  • cd -:
    • сменить каталог на $OLDPWD
    • значения подкачки PWD и OLDPWD
    • изменить верхний элемент стека каталога, чтобы он отражал (новый) PWD
  • pushd somedir:
    • сменить каталог на somedir
    • сохранить исходный каталог в OLDPWD
    • set PWD="somedir"
    • push somedir в стек каталога (расширяя его на один элемент)
  • popd:
    • сохранить исходный каталог в OLDPWD
    • удалить первый элемент стека каталога
    • сменить каталог на новый верхний элемент стека каталога
    • установить PWD в новый верхний элемент стека каталога

Примечание. Если текущий рабочий каталог считается элементом стека каталога, он отличается от zsh и bash. Я использовал bash как ссылку для приведенных выше списков.

  • В bash текущий рабочий каталог считается верхним элементом стека каталога. 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.
Дополнительные сведения см. В руководстве .

ответил Adaephon 30 MarpmWed, 30 Mar 2016 12:34:36 +03002016-03-30T12:34:36+03:0012 2016, 12:34:36

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132