Fitur apa yang ada di zsh dan hilang dari bash, atau sebaliknya?

62

Sebagai pengguna Linux, saya selalu menggunakan bash karena itu adalah default pada setiap distro yang saya gunakan. Orang yang menggunakan sistem Unix lain seperti BSD tampaknya lebih sering menggunakan shell lain. Untuk belajar lebih banyak, saya memutuskan untuk mencoba zsh.

Sebagai pengguna bash:

  • Fitur apa yang akan saya lewatkan?
  • Dan apa yang harus saya perhatikan?
Macha
sumber
5
@Gilles suatu hari nanti mungkin akan menyenangkan untuk memiliki semua yang pindah ke sini ... dan bergabung
xenoterracide

Jawaban:

45

Sudah ada sedikit aktivitas pada topik di situs Stack Exchange lainnya. Pengalaman saya beralih dari bash ke zsh, sejauh yang dapat saya ingat (bertahun-tahun yang lalu²), adalah bahwa saya tidak melewatkan satu hal pun. Saya mendapatkan banyak; berikut adalah apa yang saya pikir adalah fitur khusus zsh sederhana yang paling saya gunakan:

  • Fitur zsh yang paling saya lewatkan ketika saya sesekali menggunakan bash adalah autocd: di zsh, menjalankan direktori berarti mengubahnya, asalkan Anda mengaktifkan opsi tersebut autocd.⁴

  • Fitur lain yang sangat berguna adalah globbing mewah. The hieroglif karakter yang sedikit sulit untuk diingat tetapi sangat nyaman (seperti dalam, sering kali lebih cepat untuk mencari mereka daripada menulis setara findperintah). Beberapa contoh sederhana:
        foo*~*.bak= semua kecocokan untuk foo*kecuali yang cocok *.bak
        foo*(.)= hanya file biasa yang cocok foo*
        foo*(/)= hanya direktori yang cocok foo*
        foo*(-@)= hanya menjuntai tautan simbolik yang cocok foo*
        foo*(om[1,10])= 10 file terbaru yang cocok foo*
        foo*(Lm+1)= hanya file dengan ukuran> 1MB = dalam direktori dan semua nya subdirektori, secara rekursif⁴
        dir/**/foo*foo*dir

  • Untuk penggantian nama mewah, zmvbuiltin bisa berguna. Misalnya, untuk menyalin setiap fileke file.bak:zmv -C '(*)(#q.)' '$1.bak'

  • Baik bash dan zsh memiliki sistem penyelesaian yang layak yang perlu dinyalakan secara eksplisit ( . /etc/bash_completionatau autoload -U compinit; compinit). Zsh jauh lebih dapat dikonfigurasi dan umumnya lebih bagus.

Jika Anda menjalankan zsh tanpa a .zshrc, itu memulai menu interaktif yang memungkinkan Anda memilih opsi konfigurasi. (Beberapa distribusi dapat menonaktifkan ini; dalam hal ini, jalankan autoload zsh-newuser-install; zsh-newuser-install.) Saya sarankan untuk mengaktifkan opsi histori yang direkomendasikan, menyalakan penyelesaian ("gaya baru"), dan menghidupkan "opsi shell umum" kecuali beep. Kemudian, konfigurasikan lebih banyak opsi saat Anda menemukannya.

² Pada saat penyelesaian yang dapat diprogram adalah fitur pembunuh zsh, tetapi bash segera mendapatkannya.
Fitur yang diperoleh bash hanya dalam versi 4 (jadi masih belum tersedia di banyak sistem) ada dalam tipe yang lebih kecil.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
5
Bash 4.0 sekarang mendukung autocdfitur yang Anda diskusikan di atas. Aktifkan fitur menggunakan perintah shopt -s autocd. Kemudian fitur tersebut berfungsi seperti yang telah Anda jelaskan.
Philluminati
zsh juga memiliki whereperintah bawaan, jangan dikacaukan dengan whichperintah.
Sildoreth
@ EdGrimm Saya pikir GNU dan FreeBSD menemukan dapat melakukan segalanya zsh glob kualifikasi dapat melakukan (dengan -execshell untuk hal-hal seperti seleksi dengan edan pipa ke alat-alat seperti sortdan seduntuk menulis ulang dengan edan menyortir). Jauh lebih banyak, tentu saja.
Gilles 'SO- stop being evil'
Setelah memeriksa dan memeriksa kembali halaman pencarian find selama lebih dari satu dekade, saya rasa saya berhenti benar-benar mencari. Tetapi jika saya telah memeriksa terakhir kali sebelum berkomentar, setidaknya saya telah melihat opsi -size sekarang mengambil unit ke byte.
Ed Grimm
11

Juga penyelesaian tab default lebih baik daripada bash ... misalnya ...

~/.e.dTAB akan berkembang menjadi ~/.emacs.d/zsh, bash hanya akan berbunyi bip.

ocodo
sumber
tidak. setoptopsi non-default apa yang Anda gunakan untuk itu (jika ada)?
Saya menyadari bahwa saya telah _-.menetapkan sebagai wildcard. zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}' 'r:|[._-]=* r:|=*' 'l:|=* r:|=*' . Lihat stackoverflow.com/q/7906078/311660
ocodo
10

zshmemungkinkan Anda mengedit perintah multi-line (lihat editor baris zsh ), bash tidak. Jika Anda mencoba trik yang sama ( Ctrl-p), bash mengambil perintah terakhir.

Pedro Silva
sumber
2
Bash melakukan ini, setidaknya pada versi 4.2.37; ini menggantikan baris baru dengan titik koma dan memberi Anda satu baris untuk diedit.
Keith Thompson
1
Masih tidak baik. (:
SilverWolf
8

Bash memiliki fitur untuk dapat membuka port menggunakan

/dev/tcp/host/port

atau

/dev/udp/host/port

Namun, ini dinonaktifkan di Debian karena dianggap sebagai penghalang (jika path benar-benar ada) dan di luar ruang lingkup apa yang harus dilakukan shell. Informasi lebih lanjut [milis debian]

Portablejim
sumber
5
zsh memiliki ztcp builtin meskipun yang memiliki lebih banyak kemampuan daripada bash's / dev / tcp, tidak memiliki / dev / udp. Saya lebih suka menggunakan socat.
Stéphane Chazelas
2

Yang - ditingkatkan di zsh

The whichperintah di bash hanya mengungkapkan lokasi perintah.

Dalam Zsh whichakan mengungkapkan definisi dari alias, sumber untuk a functiondan lokasi perintah.

Katakanlah kita memiliki alias shell:

alias gg='git log'

Di Bash jika kami bertanya: which gghasilnya akan batal

In Zsh: which ggakan memberi kita ...

gg: aliased to git log

Katakanlah kita memiliki fungsi shell:

hello() {
    echo "Hello World"
}

Di Bash jika kami bertanya: which hellohasilnya akan batal.

In Zsh: which helloakan memberi kita ...

hello() {
    echo "Hello World"
}
ocodo
sumber
Bash menyediakan fungsionalitas yang sama melalui perintah type(builtin). Dan hanya untuk nitpick: whichadalah perintah eksternal, bukan bash builtin.
Torkel Bjørnson-Langen
Pertanyaan kanonik yang relevan: Mengapa tidak menggunakan "yang"? Lalu apa yang harus digunakan?
Anthony G - keadilan untuk Monica
0

zsh - shell lengkap

ada banyak, membaca zshcontrib(1)satu dapat mendeteksi dua versi game autoload-able tetris(yang lain dengan ncurses) zshdalam bersaing dengan emacs, untuk kelengkapan (seperti yang dijelaskan).

=

Saya ingin menyebutkan =kata kunci, yang dapat menyebabkan iritasi dengan curl(biasanya URL ada ?var=valdi dalamnya; tetapi itu unsetopt-able, saya pikir):

  • q file =less( gentoo) memutuskan untukq file $(which less)

= memperluas ke path lengkap dari perintah yang bersangkutan.

barang lainnya

hal-hal lain, yang keluar dari pikiran, adalah prompt yang tepat RPS1=%d(untuk ditampilkan $PWDdalam gaya), Alt + H( run-helpmis. man), Alt + ? ( which-command) vared, dan zed( autoloadfungsi), seperti minibuffer-like Emacs Alt + Xuntuk mengeksekusi widget tanpa mengikatnya, alias global dan suffix, durasi penyelesaian perintah pelacakan riwayat tambahan, -mdan -regexkorek api, emulasi shell (mis. csh, kshdengan emulate) dan autoload run-helpdengan cuplikan file untuk built-in.

ratapan

Saya pikir sebagian besar, jika tidak semua, fitur diimplementasikan sejak lama, dan membaca changelogs, tidak ada perubahan besar dan penambahan fitur baru, yang sangat menyedihkan (tidak perlu dijelajahi dan ditemukan lagi).

bashtampaknya lebih terdistribusi dalam readline(sebagai lawan zle) dan gnu historydalam semangat linux; mis. fungsi readline dan keybindings dapat diterapkan secara global (seperti yang disimpan dalam ~/.inputrcdan /etc/inputrc) jika tidak diganti oleh bash-specific bind.

kesimpulan

Saya pribadi berpikir emacs(terutama dari prospek (saat ini?) emacs-noxRasa) menjadi inspirasi untuk perangkat lunak yang luar biasa seperti zshdan tmuxmelakukan pekerjaan yang sangat baik dalam menjadi contoh dalam implementasi seperti itu; untuk orang-orang yang menghargai nilainya (ke tingkat yang tidak membutuhkan / tergantung pada Xserver). Unix shell cukup kuat, dan kontinuitas dan konsistensinya cukup untuk alur kerja dan produktivitas yang tepat (dalam komputasi keseluruhan).

ocodo
sumber