Kapan penting untuk menulis skrip portabel?

18

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/bashshebang, mengapa saya tidak menggunakan bashism? Saya mulai mendapatkan kesan bahwa beberapa orang hanya suka bash bashism (pun intended) hanya demi itu.

Orang sering menggunakan bashdan secara shellbergantian - 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 ?
toxalot
sumber
4
Saya memutakhirkan pertanyaan ini dan menjawabnya, tetapi semakin saya memikirkannya, hanya 2 pertanyaan terakhir yang cocok dengan situs ini. Yang lain "berdasarkan pendapat".
jordanm
1
Ada juga aspek meta dalam pertanyaan ini: Meskipun mungkin tidak membantu menjawab awal pertanyaan, komentar seperti "ini tidak portabel" bisa sangat membantu bagi pembaca lain yang tersandung pada pertanyaan / jawaban berbulan-bulan atau bertahun-tahun kemudian.
Bananguin
2
@Bananguin Komentar yang mengatakan "ini tidak portabel" jangan ganggu saya. Itu hanya FYI. Saya sendiri yang membuat komentar semacam itu. "Kamu seharusnya tidak menggunakan ..." yang menggangguku. Ini menyiratkan bahwa ada sesuatu yang salah dengan jawabannya. Itu akan valid jika jawabannya merekomendasikan kode usang, misalnya. Jadi itu membuat saya bertanya-tanya apa yang salah dengan Bash.
toxalot
2
+1. Terutama ketika pertanyaan memiliki bashtag sendiri, seseorang berkomentar "Ini bashism dan tidak portabel". Ketika saya menjawab pertanyaan yang ditandai C, saya tidak peduli apakah itu portabel Javaatau tidak.
PP
4
Saya merasa selalu baik untuk menunjukkan bahwa itu adalah bashfitur 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".
Martin Tournoij

Jawaban:

15

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 bashshebang Anda, Anda dapat mengharapkan skrip dieksekusi menggunakan bash. 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.

jenis skrip apa yang harus se portable mungkin?

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.

seberapa umum sistem yang tidak memiliki Bash diinstal?

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.

jika sistem telah menginstal Bash, akankah ia juga memiliki versi pencarian dan utilitas lain GNU?

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.

jordanm
sumber
1
Saya pikir ini lebih pada SO daripada di sini di mana saya sering melihat orang mengabaikan bashism . Saya hanya tahu bahwa saya sudah cukup sering merasa frustrasi dan mendorong saya untuk mengajukan pertanyaan ini.
toxalot
1
Jadi jika utilitas GNU diinstal tetapi tidak pertama di PATH, apakah ada cara untuk memanggilnya secara khusus? Kalau tidak, mengapa mereka diinstal sama sekali?
toxalot
@toxalot: Binari dan skrip dipanggil secara eksplisit dengan menggunakan path absolut.
Bananguin
1
@Bananguin Jadi jika seseorang menginstal utilitas Bash dan GNU (tetapi tidak di PATH), mereka dapat menggunakan skrip jika mereka mengeditnya untuk menggunakan jalur absolut untuk finddan 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.
toxalot
1
@toxalot: ya itu bisa berhasil. jika Anda meletakkan sesuatu seperti FIND=/opt/gnu/dispicable/bin/finddi awal skrip Anda dan kemudian gunakan ${FIND}alih-alih finddalam skrip Anda, Anda memberi orang satu (!) tempat untuk meletakkan jalur instal mereka dan membuat skrip Anda menggunakan alat yang benar.
Bananguin
5

Jadi, kapan penting untuk menulis skrip portabel?

jenis skrip apa yang harus se portable mungkin?

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 / rmpenggantian


Mark 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.

pengguna3082
sumber
3
Saya suka beberapa "Bash-isme" yang apik, tetapi untuk toolkit pemecahan masalah saya menganggap saya hanya akan memiliki vi dan shell Korn. Dan saya mencoba menggunakan perintah yang berfungsi pada sebagian besar rasa Unix. Dengan begitu saya siap melakukan triase pada sistem yang sakit tanpa harus khawatir tentang bagaimana perintah ps berperilaku, apakah Bash atau Perl atau PHP ada di sana, atau di mana mereka berada.
Mark Stewart