Ekstensi file untuk skrip shell unix [ditutup]

45

Di wikipedia, artikel untuk .sh mengatakan:

Untuk jenis ekstensi file .sh, lihat Bourne shell .

Bagaimana dengan shell unix lainnya?

Saya tahu bahwa shebang digunakan di dalam file untuk menunjukkan penerjemah untuk dieksekusi, tapi saya bertanya-tanya:

  • Apa pro dan kontra untuk ekstensi file vs tidak ada ekstensi file?
Amelio Vazquez-Reina
sumber
4
Terkadang, skrip shell tanpa shebang (atau tanpa izin exec) dapat ditemukan. Jika demikian, nama yang berakhiran .sh dapat menjadi petunjuk bagi pengguna untuk menjalankannya bash script.sh(atau sh, tentu saja).
Ansgar Esztermann
3
Jika skrip shell memiliki ekstensi, biasanya .sh. Saya belum pernah melihat skrip .ksh atau .bash. Kebanyakan skrip shell tidak memiliki ekstensi, seperti semua skrip di /etc/init.d/* sebagai contoh.
Richard Holloway
Meskipun kesimpulan sederhana (ya atau tidak) adalah pendapat, hal-hal yang perlu dipertimbangkan tidak.
ctrl-alt-delor

Jawaban:

35

Saya hanya akan memanggil .shsesuatu yang dimaksudkan untuk menjadi portabel (dan mudah-mudahan adalah portable).

Kalau tidak, saya pikir lebih baik menyembunyikan bahasa. Pembaca yang teliti akan menemukannya di baris shebang. (Dalam prakteknya, .bashatau .zsh, dll ... sufiks jarang digunakan.)

Stéphane Gimenez
sumber
1
Dari halaman ini saja, kita sudah dapat melihat cukup banyak orang yang menggunakannya. Mengapa Anda mengatakan mereka "jarang digunakan"? Ada kutipan? Atau ini hanya berdasarkan pengalaman Anda?
Pacerier
23

Saya akan mengatakan bahwa tidak ada "praktik yang baik" untuk ekstensi file ada, hanya pada teknis: sistem file Unix / Linux / * BSD tidak mendukung ekstensi per se. Apa yang Anda panggil ekstensi hanyalah sufiks dari satu nama file. Itu berbeda dari sistem file dan OS VM / CMS, VMS, MS-DOS dan Windows di mana tempat khusus dalam inode-moral-equivalen disediakan untuk ekstensi.

Kata-kata kasar kecil itu sudah berakhir, saya pikir agak konyol untuk menambahkan akhiran ".sh" atau ".ksh" atau ".bash" pada nama file skrip shell. Suatu program adalah program: tidak ada manfaat dalam membedakan apa yang dijalankan. Tidak ada unix atau linux atau kernel apa pun yang telah memutuskan untuk memanggil juru bahasa pada beberapa file hanya karena akhiran nama file. Itu semua dilakukan oleh #!baris, atau urutan "angka ajaib" byte lain di awal file. Faktanya, memutuskan apa yang akan dieksekusi berdasarkan nama file "ekstensi" adalah salah satu faktor yang menjadikan Windows sebagai magnet malware. Lihatlah berapa banyak penipuan malware Windows yang melibatkan file bernama "something.jpg.exe" - secara default Windows yang lebih baru tidak menunjukkan ekstensi ".exe", dan dorong pengguna untuk mengklik dua kali pada "

Apa yang Anda anggap sebagai perintah langsung seringkali adalah sebuah shell script. Kadang-kadang cctelah menjadi sh-script, firefoxadalah sh-script, startxadalah sh-script. Saya tidak percaya ada manfaat kognitif atau organisasi untuk menandai skrip dengan akhiran ".sh".

Bruce Ediger
sumber
24
Saya tidak setuju! Pekerjaan saya terdiri dari pengemasan aplikasi yang melibatkan ribuan file mulai dari file biner yang dapat dieksekusi hingga skrip shell (ksh, bash dan beberapa legacy csh). Bagi saya, saya percaya itu tidak membuat perbedaan untuk dapat mengetahui sekilas (atau regex) jenis file yang kita bicarakan dan kita cari. Maksud saya adalah bahwa mungkin ada manfaat dalam membedakan apa yang dikecualikan dan praktik terbaik harus mendorong menyatakan secara eksplisit jenis file.
rahmu
4
@rahmu: tulis itu sebagai jawaban. Berikan beberapa spesifik tentang bagaimana nama yang dapat dibedakan regex membantu Anda mengemas (dan mungkin memelihara) aplikasi itu. Perhatikan secara khusus interaksi antara apa yang menginterpretasikan file dan akhiran nama file dan bagaimana hal itu membantu Anda dalam melakukan tugas. Saya tertarik pada argumen serius yang menentang sudut pandang saya, dan saya bersedia berubah jika saya yakin. Saya membenarkan komentar Anda untuk membuktikannya.
Bruce Ediger
3
Saya ingin sekali, sayangnya saya hanya bisa berbicara tentang pengalaman saya saat ini dalam pekerjaan saya saat ini. Saya tidak tahu banyak tentang praktik dan standar yang baik secara umum ; Saya merasa saya harus melakukan riset sebelum mengirim jawaban di sini. Saya akan memeriksanya malam ini setelah bekerja :)
rahmu
2
@rahmu Perintah "file" ada untuk menentukan jenis file. Ia mampu membedakan skrip yang ditulis untuk cangkang yang berbeda.
Matt
3
Jika Anda memberikan .shekstensi skrip shell , Anda harus mengetiknya .shsebagai bagian dari nama perintah saat memulai. Itulah alasan utama mengapa saya tidak suka memasukkan ekstensi itu (sama dengan apa pun yang memiliki garis shebang). BTW, masalah di Windows bukanlah .exeawalan per se (itu sepele untuk membuat executable bernama image.jpgdi Linux, setelah semua), tetapi fakta bahwa Windows biasanya menyembunyikan ekstensi itu, dikombinasikan dengan fakta bahwa tindakan yang diperlukan untuk memulai executable dan untuk membuka dokumen persis sama.
celtschk
12

Sebagai orang yang telah bekerja di banyak lingkungan, saya harus menulis dalam berbagai kerang. Percaya atau tidak, di seluruh platform, cangkang tidak sama. Jadi, jika Anda mengelola perpustakaan pribadi Anda di beberapa shell (jika perlu), sangat membantu untuk menggunakan ekstensi untuk mengidentifikasi shell. Dengan begitu ketika Anda pindah ke platform lain dan shell sedikit berbeda, Anda tahu skrip apa yang akan ditargetkan untuk modifikasi. .sh .ksh .bsh .csh ...

Jumpylodo
sumber
Ini sepertinya setuju dengan unix.stackexchange.com/questions/31760/…
Pacerier
Apakah Anda tidak memiliki #!di awal skrip (misalnya #!/bin/bash)?
ctrl-alt-delor
Gnu / Linux, BSD, dan UNIX semuanya adalah Unix. Tidak perlu untuk? Nix. Linux adalah kernel, Android menggunakan Linux tetapi bukan Unix (kecuali jika Anda menambahkan perangkat lunak tambahan, dalam hal ini Anda memiliki aplikasi Unix).
ctrl-alt-delor
@ ctrl-alt-delor: "Unix" adalah merek dagang . Orang sering menggunakan "? Nix" untuk menghindari masalah merek dagang (dan pedant).
JS.
@JS `UNIX 'adalah merek dagang dari The Open Group. Unix dan unix bukan greens.org/about/unix.html
ctrl-alt-delor
6

Anda tidak boleh menggunakan ekstensi untuk executable, karena mereka tidak dapat dipertukarkan. Bayangkan Anda memiliki skrip shell a.sh, kemudian menulis ulang dengan python a.py, Anda sekarang harus mengubah setiap program yang memanggil Anda skrip, Anda telah membocorkan detail implementasi.

Seluruh ekstensi file-nama di Windows Mircosoft berantakan: misalnya apa yang bisa a.audio, b.audio, c.audio, sedang a.mp3, b.wav, c.ogg, dan d.picture, e.picture, f.picturesedang d.jpeg, e.png, f.gif. Sebagian besar waktu kita tidak peduli apa format audio atau gambar. Kita juga harus menghabiskan waktu lama mengajar pengguna baru semua ekstensi file.

ctrl-alt-delor
sumber
Alasan lain untuk tidak menggunakan yang *.shbaru saja saya temui adalah bahwa Debian run-partstidak akan menjalankan skrip dengan ekstensi, seperti pada /etc/cron.*/: archive.oreilly.com/pub/post/runparts_scripts_a_note_about.html
Ross Patterson
5

Seperti yang Anda katakan, ekstensi file Unix adalah murni informasi. Anda hanya perlu skrip Anda untuk memiliki shebang yang benar dan dapat dieksekusi.

Anda tidak dapat memiliki ekstensi atau menggunakan .sh.

Saya personnaly menggunakan konvensi berikut, terlepas dari shell yang digunakan (csh, tcsh, bash, sh, ...):

  • tidak ada ekstensi untuk skrip sistem atau kelas tinggi (sangat jarang).
  • yang .shuntuk script klasik, rendah untuk kelas tinggi.
Ouki
sumber
Apa yang Anda maksud dengan "skrip klasik, bermutu rendah hingga tinggi"?
Pacerier
Saya pikir maksud saya adalah tingkat abstraksi atau organisasi. Anda tidak peduli alat bahasa / skrip apa yang digunakan di balik beberapa perintah: jadi Anda tidak menggunakan ekstensi apa pun. Bagi yang lain, baik untuk diketahui bahwa ini adalah bash atau skrip shell ksh eksotis (dengan ekstensi yang tepat). ... tapi itu 2 tahun yang lalu;)
Ouki
3

Ekstensi skrip Shell cukup berguna. Sebagai contoh, saya sering menulis skrip yang memiliki banyak file dalam berbagai bahasa (mis. Bash, awk, dan lua) di direktori yang sama. Jika saya perlu mencari string hanya di file bash, ekstensi membuatnya sangat berguna, untuk mengurangi kesalahan positif. Atau jika saya ingin melakukan penghitungan baris semua kode bash saya untuk proyek itu.

Sangat sulit harus mengetik ekstensi ketika menjalankan program, jadi saya juga membuat symlink tanpa ekstensi ke executable utama, untuk mengedit / menjalankannya tanpa perlu mengetik ekstensi setiap kali. Symlinks murah dan mudah.

Steve
sumber
Ini sepertinya setuju dengan unix.stackexchange.com/questions/31760/…
Pacerier
2

Seperti yang orang lain katakan, shell tidak peduli dengan ekstensi. Namun, itu memungkinkan untuk mengidentifikasi file secara cepat. Saya melihat file yang diakhiri .pyatau .shdan saya segera tahu apa yang seharusnya (setidaknya). Seperti kata Steve, mencari berdasarkan ekstensi file atau melakukan penghitungan baris juga merupakan pertimbangan praktis.

qwr
sumber