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

16

Apakah ada perbedaan antara perilaku pushd / popd di bash vs zsh? Tampaknya di zsh cd, cd-berperilaku persis sama dengan pushd / popd (yang menambahkan / muncul direktori secara otomatis ketika cd) sementara di bash cd tidak mempengaruhi tumpukan direktori.

Jika seseorang dapat memberi saya sebuah pointer, itu akan menjadi hebat.

dragonxlwang
sumber
Saya hanya dapat berbicara dengan bash: menggunakan cdset variabel shell OLDPWDke direktori sebelumnya, dan cd -diterjemahkan ke cd "$OLDPWD".
glenn jackman
@glennjackman, terima kasih. Apakah itu berarti dalam bash cd tidak ada hubungannya dengan w / pushd / popd?
dragonxlwang
Saya baru saja memeriksa, dan pushdjuga mengesetOLDPWD
glenn jackman
Dan dirstack, dikembalikan oleh dirsselalu memegang PWD sebagai elemen pertama
glenn jackman
ya, tetapi juga masuk akal jika cd tidak menyentuh tumpukan dir yang dikelola oleh pushd / popd di bash.
dragonxlwang

Jawaban:

17

Tergantung. Di zshAnda dapat mengkonfigurasi cduntuk mendorong direktori lama pada tumpukan direktori secara otomatis, tetapi itu bukan pengaturan default.

Sejauh yang saya tahu zshdengan pengaturan standar berperilaku sangat mirip dengan bash:

  • cd somedir
    • ubah direktori menjadi somedir
    • simpan direktori asli di OLDPWD
    • set PWD="somedir"
    • ganti elemen atas tumpukan direktori (seperti yang ditunjukkan oleh dirs) dengan somedir(jumlah elemen pada tumpukan tidak berubah).
  • cd -:
    • ubah direktori menjadi $OLDPWD
    • nilai swap dari PWDdanOLDPWD
    • memodifikasi elemen atas tumpukan direktori untuk mencerminkan (yang baru) PWD
  • pushd somedir:
    • ubah direktori menjadi somedir
    • simpan direktori asli di OLDPWD
    • set PWD="somedir"
    • mendorong somedirke tumpukan direktori (memperluasnya dengan satu elemen)
  • popd:
    • simpan direktori asli di OLDPWD
    • hapus elemen pertama dari tumpukan direktori
    • ubah direktori ke elemen teratas baru dari tumpukan direktori
    • setel PWDke elemen teratas baru dari tumpukan direktori

Catatan: Apakah direktori kerja saat ini dianggap sebagai elemen tumpukan direktori berbeda antara zshdan bash. Saya digunakan bashsebagai referensi untuk daftar di atas.

  • Dalam bashdirektori kerja ini dianggap sebagai elemen teratas dari tumpukan direktori. The man 1 bashmengatakan:

    pushd [-n] [dir]

    […] Menambahkan dirke tumpukan direktori di bagian atas, menjadikannya direktori kerja baru saat ini seolah-olah telah disediakan sebagai argumen ke cdbuiltin. [...]

    Mencetak DIRSTACK( echo ${dirstack[@]}) mengonfirmasi bahwa elemen pertama identik dengan $PWD.

  • Dalam zshdirektori kerja sekarang bukan bagian dari tumpukan direktori (tetapi masih ditunjukkan dengan dirs). man 1 zshbuiltinsmengatakan:

    pushd [ -qsLP ] [ arg ]

    […] Ubah direktori saat ini, dan dorong direktori lama saat ini ke tumpukan direktori. Dalam bentuk pertama, ubah direktori saat ini menjadi arg. [...]

    Mencetak dirstack( echo ${dirstack[@]}) dan membandingkannya dengan output dirsharus menunjukkan bahwa PWDitu bukan bagian dari `dirstack.

Dalam kedua shell dirsmencetak direktori yang berfungsi sekarang sebagai elemen pertama. Juga di kedua cangkang, elemen tumpukan direktori dengan indeks 1merujuk ke direktori yang saat ini sebelum yang terakhir pushd. Itu karena array dalam zshbiasanya diberi nomor dari 1, sedangkan mereka dinomori dari 0dalam bash. Jadi ada sedikit perbedaan praktis


Seperti dikatakan di atas, perilaku ini dapat dimodifikasi di zsh.

Jika Anda mengatur AUTO_PUSHDopsi di zsh( setopt autopushd) cd somedirberperilaku seperti pushd somedir, direktori sebelumnya didorong ke tumpukan direktori secara otomatis. Ini mungkin terjadi pada mesin Anda. Anda dapat menjalankan setoptuntuk mendapatkan daftar opsi yang tidak diatur dengan cara default. Lihat, apakah autopushdmuncul dalam daftar.

Tapi ini tidak berubah cd -untuk berperilaku seperti popd. Sebaliknya itu hanya mendorong $PWDke tumpukan direktori, dan mengubah direktori menjadi $OLDPWD. Itu berarti berulang kali menelepon cd -sebenarnya akan menumbuhkan tumpukan direktori ( ($PWD $OLDPWD $PWD $OLDPWD $PWD …)). Jika itu benar-benar berperilaku persis seperti popdpada sistem Anda, saya akan menyarankan jika cdsebenarnya adalah builtin ( whence -v cd); mungkin saja diganti dengan alias atau fungsi.

Karena tumpukan direktori akan tumbuh lebih cepat dengan AUTO_PUSHDdiaktifkan, Anda dapat membatasi ukurannya dengan mengatur parameter DIRSTACKSIZEke ukuran maksimum yang diinginkan.
Anda juga dapat mencegah duplikat dengan mengatur PUSHD_IGNORE_DUPSopsi.
Untuk opsi lebih lanjut lihat manual .

Adaephon
sumber
apa tujuan tumpukan direktori selain melihatnya melalui dirs?
Xerus
@Xerus Memungkinkan untuk kembali ke direktori yang dikunjungi sebelumnya popdtanpa perlu mengetikkan (atau bahkan tahu) path.
Adaephon