Apakah semua skrip bash kompatibel dengan `zsh`?

63

Saya ingin beralih dari bash ke zsh tetapi khawatir tentang kompatibilitas skrip bash.

Apakah semua skrip / fungsi bash kompatibel dengan zsh? Oleh karena itu, jika itu benar apakah zsh hanyalah tambahan untuk bash?

chrisjlee
sumber
Saya menemukan ini berguna: askubuntu.com/questions/1577/moving-from-bash-to-zsh
chrisjlee

Jawaban:

55

Jika skrip Anda mulai dengan baris, skrip #!/bin/bashtersebut masih akan dijalankan menggunakan bash, bahkan jika shell default Anda adalah zsh.

Saya telah menemukan sintaks zsh sangat dekat dengan bash, dan saya tidak memperhatikan jika benar-benar ada beberapa ketidakcocokan. Saya beralih 6 tahun yang lalu dari bash ke zsh mulus.

Huygens
sumber
1
Apa bagian tersulit Anda dalam beralih?
chrisjlee
4
Tidak ada Script pribadi saya menambahkan referensi yang tepat untuk bash dan saya telah menemukan .zshrc yang baik untuk memulai. Zsh dan bash cukup mirip sehingga saya tidak benar-benar merasa sulit.
Huygens
4
dapatkah Anda mencantumkan .zshrc:)
neaumusic
Tetapi apakah baris #!/bin/bashtersebut akan diabaikan jika menjalankan file skrip suka source ./script.sh?
LCB
3
Hardg-coding jalur ke shell adalah saran yang buruk, bahkan jika itu sering dilakukan. Anda harus menggunakannya #!/usr/bin/env bashsebagai gantinya, terutama pada macOS, di mana bash default sudah sangat usang dan versi baru hampir selalu diinstal ke jalur yang berbeda.
Konrad Rudolph
29

Zsh dapat menjalankan sebagian besar skrip Bourne, POSIX atau ksh88 jika Anda meletakkannya dalam mode emulasi yang tepat ( emulate shatau emulate ksh). Itu tidak mendukung semua fitur bash atau ksh93. Zsh memiliki sebagian besar fitur bash, tetapi dalam banyak kasus dengan sintaks yang berbeda.

Shell yang Anda gunakan secara interaktif tidak relevan untuk skrip apa pun yang Anda miliki. Shell yang menjalankan skrip adalah yang ditunjukkan pada baris pertama, baris shebang . Misalnya, jika skrip dimulai dengan #!/bin/bash, itu akan dieksekusi oleh bash.

Jika Anda telah menyesuaikan bash, Anda tidak akan dapat mengubah nama Anda .bashrcmenjadi .zshrc. Beberapa hal dapat dibagikan, misalnya alias dan fungsi, selama Anda tetap berpotongan dengan persimpangan antara dua shell (persimpangan dekat dengan ksh88 dan pdksh ). Hal-hal lain, seperti pengaturan prompt, fungsi penyelesaian dan sebagian besar opsi, harus sepenuhnya ditulis ulang.

Jika Anda menulis cuplikan untuk diambil orang dari .bashrcatau atau .zshrcAnda tidak ingin mempertahankan dua versi, patuhi subset umum fitur bash dan zsh, yang mencakup sebagian besar fitur pemrograman bash. Masukkan seluruh kode Anda dalam fungsi, dan letakkan baris berikut di bagian atas setiap fungsi:

if [ -n "$ZSH_VERSION" ]; then emulate -L ksh; fi

Anda dapat menggunakan emulate shalih-alih emulate kshlebih dekat dengan sintaks sh polos, yang merupakan apa yang Anda butuhkan .profile.

Jika suatu fungsi memanggil fungsi lain, fungsi lainnya mewarisi pengaturan emulasi, jadi Anda tidak perlu meletakkan baris ini dalam fungsi internal, hanya dalam fungsi yang dipanggil oleh pengguna akhir.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
1
Shell yang Anda gunakan tidak relevan jika Anda menjalankan skrip Anda sebagai ./my_script.sh. source my_script.shdan . my_script.shakan menjalankannya seperti shell saat ini, mengabaikan shebang apa pun.
BallpointBen
3

Jika shebang #!/bin/bashdan Anda memulai skrip sebagai ./scriptskrip akan dieksekusi oleh bash. Sama sekali tidak ada masalah di sini.

Namun, jika Anda mengeksekusi zsh ./scriptatau sumbernya . ./scriptke instance zsh yang berjalan, cukup umum bahwa sintaks bash dan zsh tidak akan cocok.

Sebagai contoh, zsh tidak membagi ekspansi parameter secara default, bash memiliki builtin bantuan, tidak ada read -p promptdi zsh (sintaksnya sangat berbeda, baca cmd \? , arrays start on 1 (not 0) in zsh,Command prompt only search for external commands in zsh, or there is no (simple) equivalent to$ {foo ^} `(huruf besar hanya karakter pertama) di zsh , antara lain, ini adalah daftar panjang (kebanyakan) kesamaan dan beberapa perbedaan .

Dalam beberapa kasus, zsh dapat diminta untuk meniru shell lainnya. Dalam beberapa kasus, tidak ada sintaksis portable yang memungkinkan untuk kedua shell (tanpa menggunakan alias atau fungsi untuk meniru solusi portabel).

Namun, zsh memiliki banyak (banyak) ekstensi yang memudahkan untuk bekerja secara interaktif. Pada saat yang sama alasan yang sangat baik untuk beralih dan masalah:

  1. Pro zsh

    • Sangat menyenangkan untuk dapat melihat opsi sintaks perintah menekan tab.
    • Manfaat utama lain dari zsh adalah koreksi kesalahan saat Anda membuat kesalahan ketik. Daripada hanya menampilkan kesalahan: perintah tidak ditemukan, zsh akan mencoba menafsirkan apa yang Anda coba ketik. zsh akan menerima input ini sebagai perintah yang valid.
    • Selain itu, zsh memiliki banyak pengubah ekspansi yang memungkinkan berbagai solusi. Seperti: daftar hanya file: ls *(.)(yang sulit dengan shell lain). Bahkan jika ketika melihat cukup dalam, jawabannya menjadi kompleks di zsh ( print -rl -- *(/)) .
    • Terima matematika dengan mengapung (dengan beberapa peringatan).
  2. Con zsh:

    • Bash adalah shell default di banyak sistem lainnya.
    • Banyak opsi zsh tidak membantu secara langsung untuk menulis skrip bash yang kompatibel.
    • Bahkan bisa menjadi masalah besar ketika mencoba mempelajari dua cangkang sekaligus.

Pada akhirnya, itu adalah pilihan Anda, dan, saya selalu suka lebih banyak pilihan.

Ishak
sumber