Apakah ada yang tahu sumber daya apa pun yang berbicara tentang praktik terbaik atau pola desain untuk skrip shell (sh, bash dll)?
design-patterns
bash
shell
pengguna14437
sumber
sumber
Jawaban:
Saya menulis skrip shell yang cukup kompleks dan saran pertama saya adalah "jangan". Alasannya adalah cukup mudah untuk membuat kesalahan kecil yang menghalangi skrip Anda, atau bahkan membuatnya berbahaya.
Yang mengatakan, saya tidak punya sumber daya lain untuk melewati Anda tetapi pengalaman pribadi saya. Inilah yang biasanya saya lakukan, yang berlebihan, tetapi cenderung solid, meskipun sangat bertele-tele.
Doa
buat skrip Anda menerima opsi panjang dan pendek. hati-hati karena ada dua perintah untuk mengurai opsi, getopt dan getopts. Gunakan getopt karena Anda menghadapi lebih sedikit masalah.
Poin penting lainnya adalah bahwa suatu program harus selalu mengembalikan nol jika selesai dengan sukses, bukan nol jika terjadi kesalahan.
Panggilan fungsi
Anda dapat memanggil fungsi dalam bash, hanya ingat untuk mendefinisikannya sebelum panggilan. Fungsinya seperti skrip, mereka hanya bisa mengembalikan nilai numerik. Ini berarti Anda harus menemukan strategi berbeda untuk mengembalikan nilai string. Strategi saya adalah menggunakan variabel yang disebut HASIL untuk menyimpan hasilnya, dan mengembalikan 0 jika fungsi selesai dengan bersih. Selain itu, Anda dapat meningkatkan pengecualian jika Anda mengembalikan nilai yang berbeda dari nol, dan kemudian menetapkan dua "variabel pengecualian" (milik saya: EXCEPTION dan EXCEPTION_MSG), yang pertama berisi jenis pengecualian dan yang kedua adalah pesan yang dapat dibaca manusia.
Ketika Anda memanggil suatu fungsi, parameter fungsi ditugaskan ke vars khusus $ 0, $ 1 dll. Saya sarankan Anda untuk memasukkannya ke nama yang lebih bermakna. mendeklarasikan variabel di dalam fungsi sebagai lokal:
Situasi rawan kesalahan
Di bash, kecuali Anda menyatakan sebaliknya, variabel yang tidak disetel digunakan sebagai string kosong. Ini sangat berbahaya jika terjadi kesalahan ketik, karena variabel yang diketik dengan buruk tidak akan dilaporkan, dan akan dievaluasi sebagai kosong. menggunakan
untuk mencegah hal ini terjadi. Berhati-hatilah, karena jika Anda melakukan ini, program akan dibatalkan setiap kali Anda mengevaluasi variabel yang tidak ditentukan. Untuk alasan ini, satu-satunya cara untuk memeriksa apakah suatu variabel tidak didefinisikan adalah sebagai berikut:
Anda dapat mendeklarasikan variabel sebagai hanya baca:
Modularisasi
Anda dapat mencapai modularisasi "python like" jika Anda menggunakan kode berikut:
Anda kemudian dapat mengimpor file dengan ekstensi .shinc dengan sintaks berikut
impor "AModule / ModuleFile"
Yang akan dicari di SHELL_LIBRARY_PATH. Saat Anda selalu mengimpor di namespace global, ingatlah untuk awalan semua fungsi dan variabel Anda dengan awalan yang tepat, jika tidak, Anda berisiko bentrok nama. Saya menggunakan garis bawah ganda sebagai titik python.
Juga, letakkan ini sebagai hal pertama dalam modul Anda
Pemrograman berorientasi objek
Dalam bash, Anda tidak dapat melakukan pemrograman berorientasi objek, kecuali jika Anda membangun sistem alokasi objek yang cukup kompleks (saya memikirkannya. Ini layak, tetapi gila). Namun dalam praktiknya, Anda dapat melakukan "Pemrograman Berorientasi Singleton": Anda memiliki satu instance dari setiap objek, dan hanya satu.
Apa yang saya lakukan adalah: saya mendefinisikan objek ke dalam modul (lihat entri modularisasi). Kemudian saya mendefinisikan vars kosong (analog dengan variabel anggota) fungsi init (konstruktor) dan fungsi anggota, seperti dalam kode contoh ini
Menjebak dan menangani sinyal
Saya menemukan ini berguna untuk menangkap dan menangani pengecualian.
Petunjuk dan kiat
Jika sesuatu tidak berhasil karena suatu alasan, cobalah untuk menyusun ulang kode. Ketertiban itu penting dan tidak selalu intuitif.
bahkan tidak mempertimbangkan untuk bekerja dengan tcsh. itu tidak mendukung fungsi, dan itu mengerikan secara umum.
Semoga ini bisa membantu, walaupun harap diperhatikan. Jika Anda harus menggunakan hal-hal yang saya tulis di sini, itu berarti masalah Anda terlalu rumit untuk diselesaikan dengan shell. gunakan bahasa lain. Saya harus menggunakannya karena faktor manusia dan warisan.
sumber
getopt
vsgetopts
?getopts
lebih portabel dan berfungsi di semua shell POSIX. Terutama karena pertanyaannya adalah praktik terbaik shell, bukan khusus praktik terbaik bash, saya akan mendukung kepatuhan POSIX untuk mendukung beberapa shell jika memungkinkan.Lihatlah Panduan Bash-Scripting Lanjutan untuk banyak kebijaksanaan tentang skrip shell - bukan hanya Bash, baik.
Jangan dengarkan orang yang memberi tahu Anda untuk melihat bahasa lain yang bisa dibilang lebih rumit. Jika skrip shell memenuhi kebutuhan Anda, gunakan itu. Anda menginginkan fungsionalitas, bukan fantasi. Bahasa baru memberikan keterampilan baru yang berharga untuk resume Anda, tetapi itu tidak membantu jika Anda memiliki pekerjaan yang perlu dilakukan dan Anda sudah tahu shell.
Seperti yang dinyatakan, tidak ada banyak "praktik terbaik" atau "pola desain" untuk skrip shell. Penggunaan yang berbeda memiliki pedoman dan bias yang berbeda - seperti bahasa pemrograman lainnya.
sumber
skrip shell adalah bahasa yang dirancang untuk memanipulasi file dan proses. Meskipun bagus untuk itu, itu bukan bahasa tujuan umum, jadi selalu mencoba untuk merekatkan logika dari utilitas yang ada daripada menciptakan kembali logika baru dalam skrip shell.
Selain itu prinsip umum saya telah mengumpulkan beberapa kesalahan skrip shell umum .
sumber
Ada sesi hebat di OSCON tahun ini (2008) tentang topik ini: http://assets.en.oreilly.com/1/event/12/Shell%20Scripting%20Craftsmanship%20Presentation%201.pdf
sumber
Tahu kapan harus menggunakannya. Untuk perintah perekatan yang cepat dan kotor tidak masalah. Jika Anda perlu membuat lebih dari beberapa keputusan non-sepele, loop, apa pun, gunakan Python, Perl, dan modularisasi .
Masalah terbesar dengan shell seringkali adalah hasil akhirnya hanya tampak seperti bola lumpur besar, 4000 baris bash dan terus bertambah ... dan Anda tidak dapat menyingkirkannya karena sekarang seluruh proyek Anda bergantung padanya. Tentu saja, itu dimulai pada 40 baris pesta indah.
sumber
Mudah: gunakan python bukan skrip shell. Anda mendapatkan peningkatan keterbacaan hampir 100 kali lipat, tanpa harus menyulitkan apa pun yang tidak Anda butuhkan, dan mempertahankan kemampuan untuk mengembangkan bagian skrip Anda menjadi fungsi, objek, objek persisten (zodb), objek terdistribusi (piro) hampir tanpa ada kode tambahan.
sumber
gunakan set -e agar Anda tidak terus maju setelah kesalahan. Cobalah membuatnya kompatibel tanpa mengandalkan bash jika Anda ingin dijalankan di bukan-linux.
sumber
Untuk menemukan "praktik terbaik", lihat bagaimana distro Linux (misalnya Debian) menulis skrip init mereka (biasanya ditemukan di /etc/init.d)
Sebagian besar dari mereka tanpa "bash-isme" dan memiliki pemisahan yang baik dari pengaturan konfigurasi, file perpustakaan dan pemformatan sumber.
Gaya pribadi saya adalah menulis naskah-master yang mendefinisikan beberapa variabel default, dan kemudian mencoba memuat ("sumber") file konfigurasi yang mungkin berisi nilai-nilai baru.
Saya mencoba untuk menghindari fungsi karena cenderung membuat skrip lebih rumit. (Perl diciptakan untuk tujuan itu.)
Untuk memastikan skripnya portabel, uji tidak hanya dengan #! / Bin / sh, tetapi juga gunakan #! / Bin / ash, #! / Bin / dash, dll. Anda akan segera menemukan kode spesifik Bash.
sumber
Atau kutipan yang lebih lama mirip dengan apa yang dikatakan Joao:
"Gunakan perl. Kamu ingin tahu bash tetapi tidak menggunakannya."
Sayangnya saya lupa siapa yang mengatakan itu.
Dan ya hari ini saya akan merekomendasikan python over perl.
sumber