Sumber daya apa yang ada untuk pemrograman shell portabel? Jawaban utamanya adalah untuk menguji pada semua platform yang ditargetkan, tetapi itu jarang praktis.
Spesifikasi POSIX / Single UNIX adalah awal, tetapi tidak memberi tahu Anda apa tingkat dukungan dari setiap implementasi, atau apa ekstensi umum yang ada. Anda dapat membaca dokumentasi setiap implementasi, tetapi itu sangat memakan waktu dan tidak sepenuhnya akurat.
Saya kira bagi saya bahwa format ideal adalah semacam versi POSIX yang dianotasi komunitas, di mana setiap fitur dijelaskan oleh tingkat dukungannya di antara implementasi yang berbeda. Apakah ada hal seperti itu? Atau adakah sumber daya lain yang bermanfaat?
Misalnya, ada halaman portabilitas shell Sven Mascheck , tetapi ini hanya tentang elemen sintaksis dan beberapa built-in, dan hanya mencakup shell lama. Saya mencari sumber yang lebih komprehensif.
sumber
autoconf
danMetaconfig
(Perl,rn
) dan mengumpulkan semua trik dan komentar penjelasan mereka di satu tempat.Jawaban:
Manual autoconf memiliki bagian tentang pemrograman shell portabel .
Meskipun itu tidak secara khusus menargetkan POSIX, itu mungkin koleksi paling lengkap dari apa yang harus dilakukan dan tidak dilakukan ketika mencoba untuk menulis kode shell portabel.
sumber
Selain
dash
danposh
, adabournesh
(ataubsh
), Heirloom Bourne Shell , yang dapat digunakan untuk mendeteksi Bashism .Proyek Heirloom juga termasuk "The Heirloom Toolchest", koleksi lebih dari 100 utilitas Unix standar (yang dapat berfungsi sebagai titik awal untuk membandingkan opsi baris perintah).
sumber
Mirip dengan jawaban ini , coba jalankan skrip Anda di posh .
Juga, jangan lupa untuk mengatur
POSIXLY_CORRECT
variabel lingkungan ke true, karena ini menyebabkan banyak program (tidak hanya shell) untuk lebih ketat mematuhi standar POSIX.sumber
Menulis skrip Anda menggunakan tanda hubung mungkin merupakan awal.
sumber
find
Masih OpenBSD masih belum diimplementasikan-exec +
).find
melakukannya-exec utility {} +
sekarang.Untuk sedikit memperluas, Anda dapat mencoba paket
checkbashisms
Debian / Ubuntudevscripts
.Ini tidak sempurna, tetapi memiliki manfaat sebagai titik awal yang ada. Sebagai contoh, ia tidak melihat gangguan klasik dengan
sed
/find
mengenai GNU vs BSD / perbedaan lainnya.Secara default, ini berorientasi pada Debian + dash,
-p
flag dapat berguna untuk kasus Anda.sumber
Hari ini, Anda biasanya dapat menemukan shell POSIX pada suatu sistem, dan dengan demikian umumnya berarti Anda dapat skrip dalam bahasa POSIX (modulo menjalankan bug kepatuhan).
Satu-satunya masalah adalah bahwa
/bin/sh
kadang-kadang bukan shell POSIX. Dan Anda harus mengkodekan#!
baris menjadi skrip yang akan berperilaku sebagai executable yang bagus; Anda tidak bisa hanya meminta pengguna untuk meneliti masalah dan kemudian memanggil skrip Anda sebagai/path/to/posix/shell myscript
.Jadi, caranya adalah dengan menggunakan fitur POSIX dalam skrip Anda, tetapi buat skrip tersebut secara otomatis menemukan shell POSIX. Salah satu cara untuk melakukannya adalah seperti ini:
Ada beberapa pendekatan lain, seperti pembuatan kode. Boostrap skrip Anda dengan skrip kecil yang mengambil badan file skrip tanpa #! baris, dan menambahkan satu.
Hal terburuk yang dapat Anda lakukan adalah mulai menulis seluruh skrip sedemikian rupa sehingga dijalankan pada cangkang Bourne mulai tahun 1981. Ini hanya diperlukan jika Anda harus menulis untuk sistem yang tidak benar-benar tidak memiliki cangkang lain. .
sumber