Apakah disarankan menggunakan zsh daripada skrip bash? [Tutup]

25

Dapatkah saya berasumsi bahwa cukup banyak orang telah zshmenginstal untuk menjalankan skrip dengan a

#!/usr/bin/env zsh

sebagai shebang?

Atau apakah ini akan membuat skrip saya tidak dapat dijalankan pada terlalu banyak sistem?

Klarifikasi: Saya tertarik dengan program / skrip yang ingin dijalankan oleh pengguna akhir (seperti di Ubuntu, Debian, SUSE, Arch & c.)

Profpatsch
sumber
4
Pertanyaan aneh Siapa targetmu? Di lingkaran tertentu (pengembang web Ruby-on-Rails) zshmungkin populer sementara di orang lain (sektor perbankan) itu hampir tidak pernah terjadi. Saya pikir Anda harus memberikan lebih banyak info jika Anda memerlukan saran yang tepat untuk yang satu ini.
rahmu
Dunia pengguna akhir linux umum.
Profpatsch
2
WRT "dunia pengguna akhir linux umum", zsh tidak standar. Ini tidak diinstal secara default (pada sebagian besar atau semua distro) atau diperlukan oleh apa pun, sehingga kebanyakan orang tidak akan memilikinya.
goldilocks
3
Saya tidak zshmenginstal di salah satu sistem saya, dan saya tidak akan menginstalnya untuk satu skrip. Anda bahkan harus menghindari bashism walaupun bash biasanya tersedia.
frostschutz

Jawaban:

29

Untuk portabilitas, tidak. Meskipun zshdapat dikompilasi pada Unix atau Unix-like dan bahkan Windows setidaknya melalui Cygwin, dan dikemas untuk sebagian besar Open Source Unix-like dan beberapa yang komersial, biasanya tidak termasuk dalam instalasi default.

bashdi sisi lain diinstal pada sistem GNU (seperti bashhalnya shell dari proyek GNU) seperti sebagian besar sistem berbasis Linux yang tidak tertanam dan kadang-kadang pada sistem non-GNU seperti Apple OS / X. Di sisi komersial Unix, shell Korn (varian AT&T, meskipun lebih banyak ksh88) adalah norma dan keduanya bashdan zshberada dalam paket opsional. Pada BSD, shell interaktif yang disukai sering tcshsementara shdidasarkan pada shell Almquist atau pdkshdan bashatau zshperlu diinstal sebagai paket opsional juga.

zshdiinstal secara default di Apple OS / X. Bahkan dulu ada di /bin/shsana. Ini dapat ditemukan secara default di beberapa distribusi Linux seperti SysRescCD, Grml, Gobolinux dan mungkin yang lain, tapi saya tidak berpikir salah satu yang utama.

Seperti halnya bash, ada pertanyaan tentang versi yang diinstal dan sebagai akibatnya fitur yang tersedia. Misalnya, tidak jarang menemukan sistem dengan bash3atau zsh3. Juga, tidak ada jaminan bahwa skrip yang Anda tulis sekarang zsh5akan berfungsi dengan baik zsh6meskipun bashmereka mencoba mempertahankan kompatibilitas ke belakang.

Untuk skrip, pandangan saya adalah: gunakan sintaksis shell POSIX karena semua Unix memiliki setidaknya satu shell yang disebut sh(tidak harus dalam /bin) yang dapat menafsirkan sintaksis itu. Maka Anda tidak perlu terlalu khawatir tentang portabilitas. Dan jika sintaks itu tidak cukup untuk kebutuhan Anda, maka mungkin Anda membutuhkan lebih dari sebuah shell.

Kemudian, opsi Anda adalah:

  • Perl yang mana-mana (meskipun sekali lagi Anda mungkin harus membatasi diri pada set fitur versi lama, dan tidak dapat membuat asumsi pada modul Perl yang diinstal secara default)
  • Tentukan penerjemah dan versinya (python 2.6 atau lebih tinggi, zsh 4 atau lebih, bash 4.2 atau lebih ...), sebagai ketergantungan untuk skrip Anda, baik dengan membangun paket untuk setiap sistem yang ditargetkan yang menentukan ketergantungan atau dengan menetapkannya dalam file README yang dikirimkan bersama skrip Anda atau disematkan sebagai komentar di bagian atas skrip Anda, atau dengan menambahkan beberapa baris dalam sintaks Bourne di awal skrip Anda yang memeriksa ketersediaan penerjemah yang diminta dan menebus kesalahan eksplisit. ketika tidak, seperti skrip ini perlu zsh 4.0 atau lebih tinggi .
  • Kirimkan penerjemah bersama skrip Anda (waspadalah terhadap implikasi lisensi) yang berarti Anda juga membutuhkan satu paket untuk setiap OS yang ditargetkan. Beberapa penerjemah membuatnya lebih mudah dengan menyediakan cara untuk mengemas naskah dan penerjemahnya dalam satu executable.
  • Tulis dalam bahasa yang dikompilasi. Sekali lagi, satu paket per sistem yang ditargetkan.
Stéphane Chazelas
sumber
"zsh-man" mengatakan "tidak", aku bangga padamu! ^^ Portabilitas ftw! (dengan semua peringatannya ...). +1.
Olivier Dulac
9

Tidak Anda tidak bisa. Apa yang dijamin tersedia adalah /bin/sh, pada dasarnya shell Bourne asli. Hampir semua (perhatikan "hampir"!) Instalasi Linux akan memiliki bash, tetapi pada sistem * BSD jarang (persuasi BSD memiliki kekeliruan yang parah tentang kode GPL, seperti bash). Saya tidak tahu apa shell standar pada Mac, tapi sekali lagi, ada keraguan tentang GPL. Sama untuk Solaris.

zsh adalah shell niche, ini bukan di instalasi default Fedora (dan saya tidak percaya itu default untuk distribusi utama).

vonbrand
sumber
6
Tentu saja bukan Bourne Shell asli, melainkan sebuah shell Posix pada sistem yang sesuai dengan Posix, yang pada banyak sistem adalah / bin / sh, tetapi tidak harus demikian (Pada Solaris <= versi 10 ini adalah / usr / xpg4 / bin / sh)
Scrutinizer
Ya, instalasi "default" tidak terlalu penting. Yang penting adalah apakah itu dipasang sama sekali.
Profpatsch
@Profpatsch, maka instal default sangat relevan (mungkin distribusi menentukan apa yang benar-benar digunakan orang).
vonbrand
2
@StephaneChazelas, "niche" seperti pada "beberapa pengguna menggunakannya" / "beberapa instalasi memilikinya". Ini mungkin shell terbaik sejak irisan roti, tetapi jika hanya sebagian kecil yang menggunakannya, Anda tidak dapat menghitung bahwa itu akan dipasang di mana-mana.
vonbrand
1
Perhatikan bahwa jika Anda menganggap bahwa sebagian besar penyebaran Linux tertanam saat ini (pikirkan android, printer, router, TV, bola lampu ...), sebagian besar sistem berbasis Linux tidak memiliki bash(walaupun sistem tersebut mungkin bukan yang utama target OP ada dalam pikiran untuk pertanyaannya)
Stéphane Chazelas
2

Saya pikir itu benar-benar tergantung pada fitur tambahan zsh apa yang Anda gunakan dan di mana. Jika Anda berencana untuk mendistribusikan skrip Anda di berbagai pengguna dan sistem saya akan menyarankan untuk menggunakan bash atau bahkan sh .

Saat yang sama jika skrip Anda dirancang untuk dijalankan di seluruh organisasi Anda dan Anda memiliki konvensi untuk memiliki zsh pada mesin Anda (misalnya AMI dasar yang sama) dan tugas Anda memiliki manfaat yang jelas dari ekstensi seperti pemilih file lanjutan atau hal-hal lain dari http: / /www.rayninfo.co.uk/tips/zshtips.html Saya akan mengatakan silakan!

AB
sumber
1

Seperti yang dinyatakan, bashbiasanya tersedia di instalasi default untuk banyak distro. Skrip Anda tidak akan mencapai basis pengguna terhebat dengan mengandalkan zsh.

Sebuah pertanyaan penting untuk dijawab sebelum mendesain skrip Anda adalah " Mengapa penting skrip shell mana yang dieksekusi? "

Shell yang berbeda menggunakan sintaks yang berbeda atau menawarkan fungsi shell tambahan yang mungkin tidak didukung oleh shell lain. Untuk menulis skrip untuk "dunia pengguna akhir linux umum," tentukan apakah skrip Anda menggunakan fungsi sintaks atau shell yang bergantung pada lingkungan shell tertentu.

Misalnya, bashshell mendukung ekspansi tertentu yang tidak didukung oleh dash, Bourne shell, atau apa pun yang /bin/shmengarah pada sistem pengguna.

$ ls -l /bin/sh 
lrwxrwxrwx 1 root root 4 Feb 19  2014 /bin/sh -> dash

Coba jalankan echo {1..10}dengan /bin/shdibandingkan dengan /bin/bashdan Anda akan mendapatkan hasil yang sangat berbeda.

Hal yang sama berlaku untuk zshyang, sementara mendukung sebagian besar bashsintaks, menawarkan ekspansi tambahan dan sintaksis yang tidak didukung oleh bashshell. Lihat tabel ini membandingkan kerang untuk contoh spesifik.

Anda dapat memperluas basis pengguna potensial Anda di luar bashdengan mematuhi skrip yang berfungsi saat dipanggil dengan #!/bin/sh -u. Namun, ini menimbulkan pertanyaan penting lain untuk ditanyakan: " Apa yang dikorbankan sebagai ganti portabilitas yang lebih besar? "

Tentukan apakah perbedaan yang berkaitan dengan masalah keamanan, fungsionalitas, efisiensi, atau apa pun yang Anda rasa merupakan prioritas untuk skrip Anda akan sepadan dengan pengorbanannya. Anda mungkin tidak ingin penggunaan skrip yang tersebar luas dengan kerentanan keamanan yang diketahui hanya karena ia bekerja di lebih banyak lingkungan.

Begitu banyak skrip ditulis untuk bashmendukung skrip ini digunakan sebagai kriteria ketika membandingkan shell perintah . Lebih banyak orang akan dapat menjalankan skrip Anda daripada jika bergantung pada zshatau sintaks lain yang eksklusif untuk lingkungan shell.

Juga, ingatlah bahwa Anda pada akhirnya tidak memiliki kendali atas bagaimana pengguna mengeksekusi skrip (juga berguna untuk debugging skrip dalam shell yang berbeda ):

Ingat bahwa jika Anda menggunakan shell untuk membaca skrip shell ("sh scriptname"), alih-alih mengeksekusi secara langsung ("./scriptname"), shell akan memperlakukan semua komentar di awal skrip shell sebagai komentar. Secara khusus, komentar yang menentukan penerjemah yang akan digunakan ketika mengeksekusi skrip ("#! / Bin / sh -u") akan diabaikan, karena semua opsi yang tercantum di samping penerjemah itu.

Jadi, hal terbaik yang dapat Anda lakukan tentang hal ini adalah membuat skrip Anda portabel, asalkan tidak ada pengorbanan besar untuk bagaimana fungsinya.

Anda mungkin juga melihat konvensi pengkodean Bash - Stack Overflow .

iyrin
sumber
1
"Apa yang sedang dikorbankan" ... lihat autoconf. Mereka menargetkan / bin / sh seperti dalam "Shell Bourne Asli" karena semua shell mendukung set fitur (kecil). Dan mereka sangat menderita karenanya.
Jürgen A. Erhard
1

Satu-satunya hal yang hampir dapat Anda jamin adalah ada /bin/sh. Itu mungkin benar-benar shell yang terhubung statis, atau itu bisa menjadi link ke shell lain. Shell lain itu biasanya mendeteksi bahwa ia disebut sebagai sh dan akan berjalan dalam mode kompatibilitas.

Perhatikan kalimat hampir di kalimat pertama.

Setiap sistem seperti unix yang pernah saya kerjakan memilikinya. Banyak dari mereka juga telah menginstal bash (tetapi tidak semuanya . Misalnya bash tidak diinstal secara default pada beberapa BSD. Beberapa distribusi Linux menggunakan DASH , sebagai gantinya shell Debian Almquist.

Apa yang dapat Anda jamin adalah instruksi pemasangan Anda. Anda dapat menambahkan baris ke file README yang menyatakan perlu zsh. Jika Anda membangun sebuah paket maka Anda dapat menandai zsh sebagai ketergantungan. Anda dapat memeriksanya dengan alat autoconf / automake. Anda dapat memeriksa apakah zsh ditemukan dalam skrip instalasi (mulai dengan / bin / sh dan coba cari zsh, jika ditemukan lanjutkan. Jika tidak menampilkan kesalahan. Mis. "Peringatan: ZSH tidak diinstal. Baca file instruksi pemasangan! ".)

Saya yakin saya lupa beberapa opsi lagi. Tapi poin kuncinya adalah:

  • Anda tidak dapat menjamin apa pun sampai Anda memeriksanya.
  • Anda hampir dijamin bahwa / bin / sh ada, dan Anda dapat melakukan beberapa pengecekan dengan itu.
Hennes
sumber
POSIX membutuhkan / bin / sh, AFAIU. Seperti itu memerlukan beberapa utilitas yang masuk akal lainnya. Periksa syarat autokonfigasi GNU.
vonbrand
@vonbrand. POSIX tidak perlu /bin/sh. Ini membutuhkan shyang dalam lingkungan yang benar (yang tidak harus menjadi lingkungan default) berperilaku seperti yang ditentukan. /bin/shmungkin bukan shell POSIX. Misalnya pada Solaris 10 dan sebelumnya, itu masih adalah Bourne shell dan standar shberada di /usr/xpg4/bin.
Stéphane Chazelas