Konfigurasi Pengguna dari Script Shell. Praktik terbaik?

13

Saya menulis skrip shell dengan beberapa variabel yang harus dikonfigurasi oleh pengguna. Akan ada penginstal untuk mengunduh dan mengonfigurasi skrip, mungkin dengan mengajukan serangkaian pertanyaan. Skrip yang dimaksud ditujukan untuk pengembang lain.

Ini dapat diimplementasikan dalam beberapa cara:

  1. Gunakan placeholder dalam skrip itu sendiri dan gunakan seduntuk menggantikan mereka selama instalasi (sesuatu seperti ini: /programming/415677/how-to-replace-placeholder-in-a-text-file )

    • Pro: Semua definisi variabel terkandung dalam skrip. Sangat mudah untuk mengunduh skrip secara manual dan mengonfigurasi variabel untuk pengguna yang lebih memilih editor daripada installer.

    • Cons: Sulit untuk mengkonfigurasi ulang variabel melalui installer setelah mereka berada di tempat. Kecuali saya membuat regexp yang lebih kompleks yang akan rentan terhadap kesalahan.

  2. Gunakan file config , pada dasarnya skrip shell lain dengan tugas, dan gunakan sourceuntuk memasukkannya. (Dan mungkin letakkan di ~/.scriptname? Script utama disalin ke /usr/local/bin)

    • Pro: Sangat mudah untuk mengkonfigurasi ulang skrip. Bahkan dapat menambahkan parameter untuk melakukannya dari skrip utama (Mungkin akan bekerja di solusi pertama juga, tetapi mengedit skrip dari itu sendiri tidak terdengar seperti ide yang sangat bagus)

    • Cons: Script sekarang tergantung pada dua file dan pengguna diharuskan untuk menjalankan installer untuk file konfigurasi yang akan dibuat. Ini dapat diselesaikan dengan membuat file konfigurasi secara otomatis jika tidak ada. Tetapi menemukan file konfigurasi eksternal masih akan lebih rumit bagi pengguna yang hanya ingin mengunduh skrip, mengeditnya, dan selesai dengan itu.

Juga, beberapa opsi mengenai bagaimana konfigurasi harus dikelola oleh pengguna setelah instalasi:

  1. Git seperti
    $ myscript config server.host example.org $ myscript config server.proxypath / home / johndoe / proxy $ myscript config server.httppath / home / johndoe / web

  2. Interaktif
    $ myscript config
    Masukkan nama host server: example.org
    Masukkan path ke proxy di server: / home / johndoe / proxy
    Masukkan path ke direktori http di server: / home / johndoe / web

  3. getopts dengan opsi panjang
    $ myscript --host example.org --proxypath / home / johndoe / proxy --httppath / home / johndoe / web

  4. Sederhana
    $ myscript config example.org / home / johndoe / proxy / home / johndoe / web

Apakah ada cara lain untuk melakukan ini yang akan Anda pertimbangkan?
Adakah praktik terbaik, sesuatu yang elegan?

Charlie Rudenstål
sumber
2
Saya tidak ragu bahwa Anda dapat menulis skrip shell yang melakukan semua ini, tetapi pertanyaannya adalah mengapa Anda ingin menulis sesuatu yang sangat rumit karena memerlukan penginstal dalam skrip shell. Bagaimanapun, lihat bagaimana sistem konfigurasi kernel Linux mengelola file konfigurasinya.
Baik. Skrip 'penginstal' hanya akan mengunduh skrip asli, menyalinnya ke lokasi yang benar, dan mengajukan serangkaian pertanyaan untuk konfigurasi (3-4 variabel). Dengan cara ini saya bisa memberi pengguna satu baris perintah, wgetting skrip instalasi dan pipa ke / bin / sh. Tentu saja saya bisa melewatkan installer dan hanya menambahkan parameter 'install' ke skrip utama. Mungkin solusi yang lebih baik, bagaimana menurut Anda?
Charlie Rudenstål
"tetapi pertanyaannya adalah mengapa Anda ingin menulis sesuatu yang sangat rumit", Inilah skrip yang dimaksud: github.com/charlie-rudenstal/depo Saya mencoba mengurangi jumlah langkah yang harus dilakukan pengguna baru, terutama selama instalasi. Melihat ke dalam membuat pengaturan server yang diperlukan otomatis juga.
Charlie Rudenstål

Jawaban:

6

Apa yang akan saya harapkan dari program waras (skrip shell atau tidak):

  • Saya tidak pernah harus mengubah executable untuk mengkonfigurasinya. Ini bukan kernel OS.
  • Saya dapat melewati pengaturan apa pun menggunakan baris perintah. Ini adalah suatu keharusan untuk setiap informasi yang tidak memiliki standar yang masuk akal. Satu-satunya pengecualian adalah kata sandi yang membutuhkan input interaktif.
  • Secara opsional, saya bisa melewati pengaturan menggunakan variabel lingkungan.
  • Saya dapat menulis pengaturan menjadi file konfigurasi, dan file ini akan digunakan jika hadir dengan nama yang terkenal, atau secara eksplisit menunjuk menggunakan dua metode di atas.
  • File config menggunakan nama pengaturan dan sintaks yang sama dengan baris perintah.
9000
sumber
Saran bagus. Apakah ini pesanan yang Anda inginkan? (1) Periksa pengaturan yang lewat pada baris perintah (2) Periksa pengaturan dalam .scriptnameConfig di direktori yang sama (3) Periksa pengaturan dalam variabel lingkungan (4) Periksa pengaturan dalam .scriptnameConfig di ~ / .scriptnameConfig (5) Gunakan default pengaturan
Charlie Rudenstål
"File config menggunakan nama pengaturan dan sintaks yang sama dengan baris perintah." - Bagaimana ini seharusnya terlihat? Saya akan menggunakan sintaks tugas untuk skrip shell biasa: SETTING = VALUE. Bukankah perintah seperti sintaksis terasa sedikit aneh di dalam file konfigurasi?
Charlie Rudenstål
Lihat bagaimana mountatau sshmemungkinkan Anda untuk menggunakan sintaks yang sama pada baris perintah dan dalam konfigurasi. Anda tidak perlu menyalin sintaks baris perintah secara total; alih-alih '--foo = bar' Anda dapat menggunakan 'foo = bar'. Jika Anda menggunakan 'BarOption: Foo' sebagai gantinya, itu akan jauh lebih tidak nyaman: kebutuhan untuk mengingat jika kasusnya signifikan, kata kunci mana yang diterima dalam file dan yang pada baris perintah, dan ketidakmampuan untuk menyalin-menempelkan perintah yang berfungsi baris ke file konfigurasi dengan hanya pengeditan kosmetik.
9000
3

Ketika saya harus menulis skrip yang rumit dengan berbagai pilihan konfigurasi saya menggunakan Python dengan argparse dan ConfigParser perpustakaan. Itu membantu implementasi tetapi proses ini berlaku untuk skrip shell apa pun:

  1. Cari file konfigurasi. Jika ada, baca pengaturan apa pun yang ada di kamus / tabel pencarian.
  2. Parse menamai argumen baris perintah. Untuk setiap argumen yang diberikan, ganti nilai yang dimuat dari file konfigurasi jika ada. Untuk setiap argumen yang tidak diteruskan di baris perintah dan bukan di konfigurasi, gunakan default.
  3. Jalankan fungsi utama skrip
  4. Jika file konfigurasi tidak ada, tulis nilai yang diteruskan dan / atau nilai default untuk itu.

Preferensi saya adalah file konfigurasi untuk menyimpan opsi yang disukai ketika skrip akan digunakan berulang kali, tetapi biarkan argumen baris perintah menimpa. Tulis file config menggunakan parameter tersebut saat pertama kali dijalankan. File config kemudian dapat dibagikan dan dikomit ke repositori kode.

Dalam kasus terbaru saya, saya juga menulis default ke [DEFAULT]bagian di bagian atas file konfigurasi, kemudian memiliki bagian untuk setiap "lingkungan" dengan penggantian yang sesuai untuk masing-masing. "Lingkungan" adalah parameter pertama yang tidak disebutkan namanya untuk skrip. Jadi dalam hal ini parameter dipilih sebagai bawaan bawaan -> file konfigurasi default -> nilai bagian file konfigurasi -> parameter baris perintah . Parameter baris perintah tambahan memberikan opsi untuk menimpa konfigurasi yang ada dengan nilai jalankan terbaru. File konfigurasi ini ditulis ke direktori saat ini sehingga berlaku per proyek dan dapat dilakukan dengan sisa kode. Orang lain yang memeriksa proyek yang sama kemudian akan mulai dengan konfigurasi yang sama.

Matt S
sumber
"Parameter baris perintah tambahan memberi opsi untuk menimpa konfigurasi yang ada dengan nilai proses terbaru." Ini merupakan pendekatan yang menarik. Cara praktis untuk menggabungkan parameter dengan konfigurasi.
Charlie Rudenstål
+1, saya juga akan merekomendasikan pengaturan default dalam default.configfile yang terletak di direktori yang sama dengan skrip, kemudian mencari file konfigurasi di ~/.scriptnameuntuk menimpa nilai-nilai ini. Dengan begitu setiap nilai memiliki nilai default yang valid dan lebih mudah dipertahankan.
Aaron
2

Mengedit placeholder rentan kesalahan.

Saya akan menggunakan file Config.

Kekhawatiran Anda tentang ketergantungan valid, namun, saya tidak ingat menggunakan terlalu banyak alat yang terdiri dari satu file. Jadi secara teori Anda benar, tetapi secara praktis seharusnya cukup baik.

Sebuah Pilihan ketiga adalah untuk membuat software konfigurasi menulis versi disesuaikan baru yang khusus untuk pilihan dan parameter yang dipilih. Ini mungkin lebih sulit untuk ditulis dan diuji tentunya :)

Tidak mungkin
sumber