pushd, popd vs cd, cd- bash ve zsh


16

Bash vs zsh içindeki pushd / popd davranışı arasında bir fark var mı? Görünüşe göre zsh cd, cd- basd cd dir dir yığını etkilemezken pushd / popd (cd otomatik olarak dizin ekler / pops ekler) tam olarak aynı davranır.

Birisi bana harika bir işaretçi verebilirse.


Ben sadece bash konuşabilir: kullanarak cdkabuk değişkenini OLDPWDönceki dizine ayarlar ve cd -çevrilir cd "$OLDPWD".
glenn jackman

@glennjackman, teşekkürler. Bunun bash cd'sinde w / pushd / popd ile bir ilgisi yok mu?
dragonxlwang

Ben sadece kontrol ve pushdayrıca ayarlarOLDPWD
glenn jackman

Ve geri dönen dirstack, dirsher zaman PWD'yi ilk eleman olarak tutar
glenn jackman

evet, ama cd bash / popd tarafından yönetilen dir yığınlarına dokunmazsa da çok mantıklı.
dragonxlwang

Yanıtlar:


17

Değişir. Içinde dizin dizinindeki eski dizini otomatik olarak itmek için zshyapılandırabilirsiniz cd, ancak bu varsayılan ayar değildir.

Bildiğim kadarıyla zshvarsayılan ayarları ile söyleyebilirim çok benzer davranır bash:

  • cd somedir
    • dizini olarak değiştir somedir
    • orijinal dizini kaydet OLDPWD
    • Ayarlamak PWD="somedir"
    • dizin yığınının üst öğesini (ile gösterildiği gibi dirs) somedir(yığındaki öğe sayısı değişmez) ile değiştirin.
  • cd -:
    • dizini olarak değiştir $OLDPWD
    • takas değerleri PWDveOLDPWD
    • dizin yığınının üst öğesini yansıtacak şekilde değiştirmek (yeni) PWD
  • pushd somedir:
    • dizini olarak değiştir somedir
    • orijinal dizini kaydet OLDPWD
    • Ayarlamak PWD="somedir"
    • somedirdizin yığınının üzerine itin (bir öğe genişleterek)
  • popd:
    • orijinal dizini kaydet OLDPWD
    • dizin yığınının ilk öğesini kaldır
    • dizini dizin yığınının yeni üst öğesine değiştir
    • PWDdizin yığınının yeni üst öğesine ayarlanır

Not: Mevcut çalışma dizininin dizin yığının bir öğesi olarak kabul zshedilip edilmemesi ve arasında farklılık gösterir bash. bashYukarıdaki listeler için referans olarak kullandım .

  • Olarak bash, bu çalışma dizini dizin yığının üst eleman olarak kabul edilmektedir. man 1 bashdiyor ki:

    pushd [-n] [dir]

    […] dirÜstteki dizin yığınına ekler ve yeni mevcut çalışma dizini cdyerleşik olarak argüman olarak sağlanmış gibi yapar . [...]

    Printing DIRSTACK( echo ${dirstack[@]}), ilk öğenin aynı olduğunu onaylar $PWD.

  • Olarak zsh, bu çalışma dizini dizin yığınının parçası (ama yine de gösterilen değildir dirs). man 1 zshbuiltinsdiyor:

    pushd [ -qsLP ] [ arg ]

    […] Geçerli dizini değiştirin ve eski geçerli dizini dizin yığınına itin. İlk formda, geçerli dizini arg olarak değiştirin. [...]

    Yazdırma dirstack( echo ${dirstack[@]}) ve çıktı ile karşılaştırılması dirstack'ın bir parçası olmadığını dirsgöstermelidir PWD.

Her iki kabukta dirsda mevcut çalışma dizinini ilk öğe olarak yazdırır. Ayrıca her iki kabukta, dizini içeren dizin yığını öğesi 1, sondan önceki geçerli dizine başvurur pushd. Bunun nedeni, içindeki diziler zshgenellikle 'den' 1, 'den 0' olarak numaralandırılır bash. Yani pratikte çok az fark var


Yukarıda belirtildiği gibi, bu davranış değiştirilebilir zsh.

Eğer ayarlarsanız AUTO_PUSHDseçeneği zsh( setopt autopushd) cd somedirdavranacağını gibi pushd somedir, önceki dizin otomatik dizin depo üzerine itilir. Muhtemelen makinenizdeki durum budur. setoptVarsayılan şekilde ayarlanmamış seçeneklerin bir listesini almak için çalıştırabilirsiniz . autopushdListede görünüp görünmediğine bakın .

Ancak bu, cd -davranış gibi değişmez popd. Bunun yerine sadece $PWDdizin yığınına iter ve dizini olarak değiştirir $OLDPWD. Bu, art arda çağırmanın cd -aslında dizin yığınını ( ($PWD $OLDPWD $PWD $OLDPWD $PWD …)) büyüteceği anlamına gelir . Aslında tam olarak popdsisteminizdeki gibi davranıyorsa cd, aslında builtin ( whence -v cd) olup olmadığını öneririm ; bir takma ad veya işlevle değiştirilmesi mümkündür.

Dizin yığını AUTO_PUSHDetkinleştirildiğinde oldukça hızlı büyüyeceğinden , parametreyi DIRSTACKSIZEistenen maksimum boyuta ayarlayarak boyutunu sınırlayabilirsiniz . Seçeneği
ayarlayarak kopyaları da engelleyebilirsiniz PUSHD_IGNORE_DUPS.
Daha fazla seçenek için kılavuza bakınız .


dizin yığınının ona bakmaktan başka amacı dirsnedir?
Xerus

@Xerus Daha önce ziyaret edilen dizinlere popdyolu yazmanıza (veya hatta bilmenize) gerek kalmadan geri dönmenizi sağlar .
Adaephon
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.