Kebanyakan kode yang saya tulis adalah dalam PHP. Saya baru-baru ini mulai belajar skrip shell. Sebagian besar sumber daya dan tutorial yang saya temui khusus untuk Bash. Beberapa memperingatkan tentang bashisme dan beberapa tidak. Saya sudah banyak membaca di sini dan Stack Overflow.
Setiap kali jawaban menggunakan bashism , seseorang pasti akan berkomentar untuk mengatakan:
Anda tidak boleh menggunakan <insert bashism here>. Ini tidak portabel.
Ini terjadi bahkan ketika pertanyaan itu ditandai bash. Bagi saya, itu seperti memberi tahu programmer PHP bahwa mereka tidak boleh menggunakan kode yang baru di PHP 5 karena tidak dapat digunakan dengan PHP 4. Atau memberi tahu seseorang bahwa mereka tidak boleh menulis sesuatu untuk Mac karena itu tidak dapat digunakan di Windows.
Ketika saya menulis dalam PHP, saya memilih persyaratan minimum dan saya menulis maju- kode yang kompatibel. Saya tidak khawatir membuatnya mundur -kompatibel.
Jika saya menggunakan #!/bin/bash
shebang, mengapa saya tidak menggunakan bashism? Saya mulai mendapatkan kesan bahwa beberapa orang hanya suka bash bashism (pun intended) hanya demi itu.
Orang sering menggunakan bash
dan secara shell
bergantian - mungkin karena fakta bahwa bash adalah shell default pada banyak sistem. Jadi saya bisa mengerti menambahkan komentar untuk memperingatkan bahwa kode menggunakan bashism, tapi saya tidak mengerti implikasi bahwa salah menggunakannya.
Jelas, jika saya menulis naskah hanya untuk penggunaan pribadi, saya dapat menulisnya dalam bahasa apa pun yang saya inginkan. Tetapi saya ingin berpikir bahwa beberapa kode yang saya tulis dapat bermanfaat bagi orang lain.
Saya mencoba mencari jawaban untuk pertanyaan saya sebelum memposting. Saya menemukan banyak informasi tentang cara menguji portabilitas, tetapi tidak dapat menemukan apa pun tentang saat penting untuk melakukannya.
Jadi, kapan penting untuk menulis skrip portabel?
Sebagai contoh,
- jenis skrip apa yang harus se portable mungkin?
- seberapa umum sistem yang tidak memiliki Bash diinstal?
- jika sistem telah menginstal Bash, akankah ia juga memiliki versi pencarian dan utilitas lain GNU ?
sumber
bash
tag sendiri, seseorang berkomentar "Ini bashism dan tidak portabel". Ketika saya menjawab pertanyaan yang ditandaiC
, saya tidak peduli apakah itu portabelJava
atau tidak.bash
fitur khusus, dan bukan portabel, sama seperti saya akan menunjukkan bahwa ekstensi spesifik GNU sedang digunakan untuk beberapa utilitas (meskipun pertanyaannya ditandai sebagai Linux). Saya belum pernah melihat orang mengatakan "ini adalah bashism dan Anda tidak boleh menggunakannya".Jawaban:
Sebagai anggota komunitas ini saya tidak sering melihat orang mengabaikan bashism untuk hal-hal yang menargetkan bash. Ketika berbicara tentang portabilitas, GNUisme jauh lebih buruk daripada bashisme. Selama Anda menggunakan
bash
shebang Anda, Anda dapat mengharapkan skrip dieksekusi menggunakanbash
. Namun, Anda tidak dapat menjamin versi kecuali Anda secara eksplisit memeriksa. Bash versi 4 membawa beberapa fitur yang berguna seperti array asosiatif, tetapi Bash v3 masih banyak digunakan pada OS X dan RHEL 5.Ini lebih tentang kebutuhan Anda dan apa yang Anda pilih untuk didukung sebagai pengembang. Jika Anda menulis skrip instal untuk aplikasi yang mendukung semua jenis * NIX, maka portabilitas akan menjadi sangat penting.
FreeBSD dan Solaris 10 adalah contoh sistem yang tidak disertai dengan bash yang diinstal secara default. Sebagian besar sistem Linux akan memilikinya, terkecuali sistem embedded.
Tidak, dan ini adalah masalah nyata dengan portabilitas. Jika portabilitas penting, Anda hanya boleh menggunakan fitur perintah shell yang ditentukan oleh standar POSIX. Utilitas GNU dapat diinstal pada sistem non-GNU seperti FreeBSD, tetapi tidak mungkin menjadi yang pertama di PATH, dan Anda tidak dapat mengandalkan alat-alat yang akan diinstal.
sumber
find
dan apa pun utilitas khusus GNU lain yang telah saya gunakan? Jelas, itu tidak akan mudah digunakan untuk skrip penginstal. Tapi saya berpikir untuk meletakkan sesuatu di GitHub agar orang lain ambil jika mereka menginginkannya. Saya tidak peduli itu tidak portabel untuk setiap sistem. Saya hanya tidak ingin itu tidak berguna pada banyak sistem.FIND=/opt/gnu/dispicable/bin/find
di awal skrip Anda dan kemudian gunakan${FIND}
alih-alihfind
dalam skrip Anda, Anda memberi orang satu (!) tempat untuk meletakkan jalur instal mereka dan membuat skrip Anda menggunakan alat yang benar.Ketika Anda menggunakannya untuk lingkungan kerja Anda, dan Anda bekerja (atau mungkin di masa depan) pada mesin yang berbeda - DAN, Anda tidak ingin harus menulis ulang alat Anda sebelum mulai bekerja.
misalnya: skrip sampah /
rm
penggantianMark Stewart:
... untuk toolkit pemecahan masalah saya, saya berasumsi saya hanya akan memiliki vi dan shell Korn. Dan saya mencoba menggunakan perintah yang berfungsi pada sebagian besar rasa Unix.
sumber