Haruskah saya meletakkan ekstensi file * .sh dan * .rb di semua skrip saya?

20

Saya memiliki banyak skrip executable linting tangan di direktori $ HOME / bin saya. Beberapa ditulis dalam bash, beberapa di Ruby. Semua dari mereka memiliki garis shebang di bagian atas memberitahu shell apa juru bahasa untuk digunakan (bash atau Ruby, dalam kasus saya).

Saya ingin tahu apakah lebih baik meletakkan ekstensi file pada skrip ini untuk menunjukkan bahasa skrip apa yang mereka tulis? Misalnya, skrip di Ruby akan memiliki akhiran * .rb, dan yang bash akan memiliki akhiran * .sh.

Saat ini, skrip ini hanya memiliki nama sederhana tanpa ekstensi file.

Apa praktik terbaik?

dan
sumber
1
Cukup mudah untuk mengonversi dari shebang ke ekstensi dan kembali dengan skrip sederhana. Jadi coba satu dan perbaiki nanti jika perlu.
Aaron J Lang

Jawaban:

9

Anda dapat melakukan perintah wildcard seperti ls *.rbatau cp *.shjika Anda ingin mengatur skrip Anda di masa depan.

Mulai lebih awal atau menyesal kemudian, menurut pendapat saya.

Editor seperti vimjuga akan dapat menerapkan penyorotan sintaks yang benar berdasarkan ekstensi file atau shebang .

Ini juga dapat dicapai dengan menggunakan modelines di berbagai editor. Misalnya untuk vim:

# vim: ft=sh
Jin
sumber
2
IMHO, organisasi lebih baik dilakukan oleh fungsi, bukan oleh detail implementasi.
grawity
4
@grawity: tetap saja diatur dengan sufiks yang lebih sederhana daripada menangkap untuk shebang ...
akira
Meskipun saya setuju dengan alasan glob, kebanyakan editor cukup pintar untuk membaca shebang untuk menentukan tipe file.
Rich Homolka
10

Yah - seperti kebanyakan hal dalam hidup: Itu tergantung pada kebutuhan Anda.

Anda menyatakan bahwa skrip ini berada di direktori bin dan saya berasumsi bahwa skrip ini harus dipanggil dari baris perintah. Sebagai pengguna saya menganggapnya menjengkelkan jika saya harus mengetik bla.ksh atau foo.bash. Juga jika pembuat kode memutuskan untuk pindah ke juru bahasa lain nama perintah akan berubah juga dan saya harus mengubah skrip lain yang menggunakan alat-alat ini - sangat menjengkelkan, bahkan jika pengguna dan pembuat kode adalah orang yang sama.

Tetapi di sisi lain saya menggunakan ekstensi seperti .sh atau .tcl dalam proyek saya membangun direktori. Dengan cara ini saya dapat menggunakan fitur make untuk menyebarkan file ke direktori tujuan mereka - tetapi pada tahap ini saya menghapus akhiran file.

ktf
sumber
6

Jelas ada beberapa perbedaan antara file yang dapat dieksekusi dalam bindirektori, dan file "sumber" yang dapat diedit.

  • Untuk file sumber, akan sangat membantu untuk memiliki akhiran sehingga Anda dapat melihat apa itu, dan untuk membantu beberapa alat yang kurang cerdas yang gagal untuk memindai #!baris.
  • Untuk modul, mereka hanya digunakan oleh serangkaian program terkait, yang semuanya menggunakan penerjemah yang sama (atau tidak ada penerjemah), dan itu adalah konvensional untuk dimasukkan .pm, .shatau .sodalam kasus seperti itu.
  • Untuk program yang dapat dieksekusi, namanya adalah bagian dari "kontrak pemrograman" yang digunakan pengguna dan skrip lain untuk menjalankannya. Penting bahwa nama tersebut tidak berubah bahkan jika implementasinya berubah ; jadi jelas nama file tidak boleh memiliki akhiran

Dalam kasus program yang dikompilasi, perbedaan antara "sumber" dan "dieksekusi" jelas: satu berisi kode sumber, yang lain berisi bahasa mesin atau diterjemahkan dengan bytecode. Dalam kasus skrip, tidak ada perbedaan yang jelas, tetapi makeperintah mempertahankan pemisahan nosional antara "kode sumber untuk skrip" dan "versi skrip yang dapat dieksekusi": "kompiler" default untuk "skrip shell" hanyalah cp.

Saya akan merekomendasikan menyimpan $HOME/sourcedirektori terpisah , dan baik:

  • menjaga symlink, seperti yang dibuat oleh ln -s ../source/foo.sh $HOME/bin/foo; atau
  • menyalinnya secara manual setelah membuat perubahan (dan mengujinya), menggunakan install -m 755 foo.sh ../bin/foo; atau
  • menggunakan Makefileaturan untuk melakukan pemeriksaan sintaksis sebelum menyalin file sumber dari $HOME/sourceke$HOME/bin

Catatan kaki: modul shell script hanya dapat digunakan oleh shell script lain, dan memodifikasi konteks internal script yang menggunakan .atau sourcebuilt-in perintah. Ini berbeda dari skrip yang dapat dieksekusi, yang (seperti program apa pun) berjalan sebagai proses terpisah dan tidak dapat mengubah proses induknya. Sebagai konvensi kasar, modul masuk /usr/lib/name_of_program/name_of_module.shsedangkan perintah masuk /usr/bin/name_of_command(tanpa akhiran apa pun).

Martin
sumber
3

Itu tidak perlu. Kernel sudah diinformasikan tentang penerjemah yang tepat untuk digunakan (oleh #!baris), dan semua editor teks populer membacanya juga, jadi menambahkan ekstensi tidak akan berguna, hanya meningkatkan pengetikan. Satu-satunya saat program yang dapat dieksekusi memiliki ekstensi adalah ketika itu entah bagaimana penting (untuk program atau pengguna atau keduanya).


Modul dan pustaka, di sisi lain, hampir selalu memiliki ekstensi ( .rbuntuk modul Ruby, .sountuk pustaka bersama ELF, dan sebagainya).

grawity
sumber
pertanyaannya bukan tentang 'apakah kernel dapat menjalankannya jika saya tidak memberikan sufiks' tetapi tentang 'apakah ini membantu saya'. peningkatan karakter yang diketik tidak relevan dengan penyelesaian.
akira