Dapatkah saya berasumsi bahwa cukup banyak orang telah zsh
menginstal 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.)
bash
zsh
portability
shebang
Profpatsch
sumber
sumber
zsh
mungkin 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.zsh
menginstal di salah satu sistem saya, dan saya tidak akan menginstalnya untuk satu skrip. Anda bahkan harus menghindari bashism walaupun bash biasanya tersedia.Jawaban:
Untuk portabilitas, tidak. Meskipun
zsh
dapat 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.bash
di sisi lain diinstal pada sistem GNU (sepertibash
halnya 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 banyakksh88
) adalah norma dan keduanyabash
danzsh
berada dalam paket opsional. Pada BSD, shell interaktif yang disukai seringtcsh
sementarash
didasarkan pada shell Almquist ataupdksh
danbash
atauzsh
perlu diinstal sebagai paket opsional juga.zsh
diinstal secara default di Apple OS / X. Bahkan dulu ada di/bin/sh
sana. 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 denganbash3
atauzsh3
. Juga, tidak ada jaminan bahwa skrip yang Anda tulis sekarangzsh5
akan berfungsi dengan baikzsh6
meskipunbash
mereka 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:
sumber
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).
sumber
bash
(walaupun sistem tersebut mungkin bukan yang utama target OP ada dalam pikiran untuk pertanyaannya)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!
sumber
Seperti yang dinyatakan,
bash
biasanya tersedia di instalasi default untuk banyak distro. Skrip Anda tidak akan mencapai basis pengguna terhebat dengan mengandalkanzsh
.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,
bash
shell mendukung ekspansi tertentu yang tidak didukung olehdash
, Bourne shell, atau apa pun yang/bin/sh
mengarah pada sistem pengguna.Coba jalankan
echo {1..10}
dengan/bin/sh
dibandingkan dengan/bin/bash
dan Anda akan mendapatkan hasil yang sangat berbeda.Hal yang sama berlaku untuk
zsh
yang, sementara mendukung sebagian besarbash
sintaks, menawarkan ekspansi tambahan dan sintaksis yang tidak didukung olehbash
shell. Lihat tabel ini membandingkan kerang untuk contoh spesifik.Anda dapat memperluas basis pengguna potensial Anda di luar
bash
dengan 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
bash
mendukung skrip ini digunakan sebagai kriteria ketika membandingkan shell perintah . Lebih banyak orang akan dapat menjalankan skrip Anda daripada jika bergantung padazsh
atau 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 ):
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 .
sumber
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:
sumber
/bin/sh
. Ini membutuhkansh
yang dalam lingkungan yang benar (yang tidak harus menjadi lingkungan default) berperilaku seperti yang ditentukan./bin/sh
mungkin bukan shell POSIX. Misalnya pada Solaris 10 dan sebelumnya, itu masih adalah Bourne shell dan standarsh
berada di/usr/xpg4/bin
.