Saat ini saya sedang mengembangkan skrip Bash yang lebih besar (ini adalah proyek Open Source milik saya) dan mulai berantakan. Saya telah membagi logika menjadi beberapa fungsi, menggunakan variabel lokal di mana saya bisa dan hanya mendeklarasikan beberapa variabel global. Namun, ini menjadi sangat sulit untuk dipertahankan.
Saya berpikir tentang memecah skrip menjadi beberapa skrip dan sumber mereka dalam skrip utama saya (mirip dengan impor dalam bahasa lain).
Tapi saya ingin tahu apakah ini merupakan pendekatan yang layak. Pertama, sumber beberapa skrip bisa sangat memperlambat waktu eksekusi skrip, dan kedua, membuat distribusi lebih sulit.
Jadi, apakah ini pendekatan yang baik, dan apakah proyek (Sumber Terbuka) lainnya melakukannya dengan cara yang sama?
Jawaban:
Ya, itu adalah praktik umum. Sebagai contoh, pada hari-hari awal Unix kode shell yang bertanggung jawab untuk memandu sistem melalui fase boot ke operasi multiuser adalah file tunggal
/etc/rc
,. Saat ini proses boot dikontrol oleh banyak skrip shell, dipecah oleh fungsi, dengan fungsi umum dan variabel bersumber seperti yang diperlukan dari lokasi pusat. Distribusi Linux, Mac, BSD, semuanya telah mengadopsi pendekatan ini dengan tingkat yang bervariasi.sumber
Apakah shell alat yang tepat untuk pekerjaan pada saat itu? Sebagai seorang pengembang yang mengalami masalah kode tumbuh saya dapat memberitahu Anda bahwa penulisan ulang tidak boleh dipertimbangkan tetapi mempertimbangkan memisahkan potongan menjadi sesuatu yang lebih cocok untuk skala yang Anda cari untuk mengembangkan aplikasi Anda - mungkin python atau ruby atau bahkan perl ?
Shell adalah bahasa utilitas - ini adalah bahasa scripting - dan karenanya akan sulit untuk mengembangkannya ke ukuran itu.
sumber
Jika itu membuat perawatan Anda lebih mudah, Anda dapat memiliki keduanya. Membaginya menjadi bagian-bagian yang logis sehingga Anda dapat mempertahankannya dengan mudah, lalu menulis (mis., Makefile untuk menyatukannya kembali untuk distribusi. Anda dapat menulis beberapa skrip cepat untuk menyalin fungsi dari file include ke file output sebagai pengganti yang
source
garis atau hanya melakukan sesuatu yang sepele seperti ini (Anda harus kembali tabify-ini, sebagaimake
membutuhkan tab):Anda kemudian memiliki versi "sumber" (digunakan untuk mengedit) dan versi "biner" (digunakan untuk instalasi sepele).
sumber
Sebuah skrip dapat dipecah seperti yang Anda gambarkan - apa saja dapat dilakukan. Saya akan mengatakan bahwa 'pendekatan yang baik' adalah untuk mengkotak-kotakkan skrip besar Anda, mencari tahu di mana bagian-bagian itu dapat dijalankan sebagai proses terpisah, berkomunikasi melalui mekanisme IPC.
Selain itu, untuk skrip shell, saya akan mengemasnya sebagai satu file. Seperti yang Anda katakan, ini membuat distribusi lebih sulit: Anda juga harus tahu di mana skrip 'pustaka' berada - tidak ada standar yang bagus untuk skrip shell - atau mengandalkan pengguna untuk menetapkan jalurnya dengan benar.
Anda bisa mendistribusikan program instalasi yang menangani semua ini untuk Anda, mengekstrak file-file itu, meletakkannya di tempat yang tepat, memberi tahu pengguna untuk menambahkan sesuatu seperti
export PROGRAMDIR=$HOME/lib/PROGRAM
ke file ~ / .bashrc. Maka program utama bisa gagal jika$PROGRAMDIR
tidak disetel atau tidak berisi file yang Anda harapkan.Saya tidak akan terlalu khawatir tentang overhead memuat skrip lain. Overhead sebenarnya hanya membuka file; pemrosesan teks adalah sama, terutama jika mereka adalah definisi fungsi.
sumber
Praktik umum atau tidak, saya tidak berpikir mendapatkan apa pun selain seperangkat ekspor adalah ide yang bagus. Saya menemukan bahwa mengeksekusi kode dengan sumber itu hanya membingungkan, dan membatasi penggunaan kembali, karena pengaturan variabel lingkungan dan lainnya membuat kode bersumber sangat tergantung pada kode sumber.
Anda lebih baik memecah aplikasi menjadi skrip mandiri yang lebih kecil, kemudian menjalankannya sebagai serangkaian perintah. Ini akan memudahkan debugging, karena Anda dapat menjalankan setiap skrip mandiri dalam shell interaktif, memeriksa file, log, dll di antara setiap permintaan perintah. Skrip aplikasi tunggal dan besar Anda berubah menjadi skrip pengendali yang lebih sederhana yang hanya menjalankan serangkaian perintah setelah Anda selesai debugging.
Sekelompok skrip yang lebih kecil dan mandiri berjalan ke masalah yang lebih sulit untuk diinstal.
sumber
Alternatif untuk sumber skrip hanya memanggil mereka dengan argumen. Jika Anda telah memecah sebagian besar fungsi Anda menjadi fungsi-fungsi shell, Anda mungkin sudah cukup dekat untuk dapat melakukan ini. Cuplikan Bash berikut memungkinkan setiap fungsi yang dideklarasikan dalam skrip untuk digunakan sebagai sub-perintah:
Alasannya tidak
source
untuk menghindari polusi lingkungan dan opsi.sumber
Berikut adalah contoh saya tentang bagaimana skrip bash besar dapat dipecah menjadi beberapa file dan kemudian dibangun menjadi satu skrip yang dihasilkan: https://github.com/zinovyev/bash-project
Saya menggunakan a
Makefile
untuk tujuan ini:sumber