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


16

Чи є різниця між поведінкою pushd / popd у bash vs zsh? Схоже, в zsh cd cd поводиться точно так само, як pushd / popd (який додає / pops каталог автоматично, коли cd), тоді як у bash cd не впливає на стек dir.

Якщо хтось може дати мені вказівник, це було б чудово.


Я можу розмовляти тільки з bash: за допомогою cdвстановлення змінної оболонки OLDPWDв попередній каталог і cd -отримує переклад на cd "$OLDPWD".
Гленн Джекман

@glennjackman, дякую Це означає, що в bash CD не має нічого спільного з w / pushd / popd?
dragonxlwang

Я щойно перевірив, а pushdтакож встановлюєOLDPWD
glenn jackman

А грячка, повернута dirsзавжди, утримує PWD як перший елемент
glenn jackman

так, але це також має багато сенсу, якщо CD не торкається стеків dir, якими керує pushd / popd у bash.
dragonxlwang

Відповіді:


17

Це залежить. У zshви можете налаштувати , cdщоб натиснути на старий каталог на каталог стека автоматично, але це не за замовчуванням.

Наскільки я можу сказати, що zshз налаштуваннями за замовчуванням поводиться дуже схоже на bash:

  • cd somedir
    • змінити каталог на somedir
    • зберегти початковий каталог у OLDPWD
    • набір PWD="somedir"
    • замініть верхній елемент стека каталогів (як показано на dirs) somedir(кількість елементів у стеку не змінюється).
  • cd -:
    • змінити каталог на $OLDPWD
    • значення swap PWDіOLDPWD
    • змінити верхній елемент стека каталогів, щоб відобразити (новий) PWD
  • pushd somedir:
    • змінити каталог на somedir
    • зберегти оригінальний каталог у OLDPWD
    • набір PWD="somedir"
    • натисніть 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параметр.
Для отримання додаткових варіантів ознайомтеся з посібником .


яка мета стека каталогів, окрім того, як дивитись на нього через dirs?
Ксерус

@Xerus Це дозволяє повернутися до раніше відвіданих каталогів popdбез необхідності вводити (або навіть знати) шлях.
Adaephon
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.