Mengapa "she-bang" dimulai dengan "#!"?

10

Mengapa "she-bang" dimulai dengan #!, seperti #!/bin/bash? Saya selalu menerima bahwa ini bagaimana hal itu dilakukan, tetapi apakah ada alasan di baliknya?

Mengapa memulai dengan #; bukankah itu biasanya komentar? Ataukah itu yang seharusnya menjadi komentar?

Johan
sumber
4
Wikipedia memiliki sejarah yang cukup rinci #!(sebanyak mengingat dmr ...), termasuk penjelasan mengapa #(ya, garis harus diabaikan oleh cangkang yang ada).
Gilles 'SO- berhenti bersikap jahat'
Ketinggalan untuk memeriksa wikipedia :)
Johan
1
Saya hanya berharap kerang-kerang itu cukup pintar untuk melepaskan CR / LF yang tidak ada jika ada ...;)
Aaron D. Marasco

Jawaban:

16

Biasanya shebang hanya merujuk pada #!( !biasanya disebut "bang", dan sepertinya "dia" adalah korupsi dari "SHArp" atau "haSH" untuk #) - seluruh baris disebut garis shebang

Itu memang dimulai dengan karakter komentar untuk kompatibilitas ke belakang dengan hal-hal yang tidak tahu bagaimana menanganinya; yang !diduga hanya untuk membedakannya dari komentar acak mulai file, sehingga file yang dimulai dengan # this is my script!tidak mencoba untuk menjalankan this is my script!interpreter

Michael Mrozek
sumber
2
Bang !sering digunakan dalam konteks lain untuk menunjukkan perintah yang akan dieksekusi. Sebagai contoh dalam vimatau program lain dengan baris perintah mereka sendiri, bang sering kali adalah karakter pelarian yang membuat mereka menjalankan perintah dalam shell sistem alih-alih antarmuka internal mereka.
Caleb
4

Untuk memahami ini, Anda harus menyadari bahwa baris pertama skrip sebenarnya dibaca dua kali , oleh 2 program yang berbeda. Pertama kali, kernel membuka file dan mencari urutan karakter ( #!) di baris pertama. Jika menemukannya, ia menjalankan program shell yang ditunjukkan di sana, meneruskan nama file sebagai parameter. (misalnya jika file /home/me/foodimulai dengan #!/bin/sh, kernel akan berjalan /bin/sh /home/me/foo).

Selanjutnya shell ( bin/shatau program penerjemah apa pun ditentukan) membaca file. Shell tidak tahu apa-apa tentang garis shebang tetapi masih akan membaca baris pertama karena sama seperti baris lain dalam file ... ia membaca semuanya. Anda tidak ingin shell crash atau mengubah perilakunya dengan cara apa pun ... cara untuk melakukannya adalah dengan membuatnya memperlakukan sebagai komentar dan abaikan saja. Dengan demikian, karakter terbaik untuk memulai instruksi kernel adalah karakter komentar.

JoelFan
sumber
Apakah benar kernel yang melakukan itu, sepertinya shell yang Anda gunakan saat ini akan menguraikan shebang dan kemudian mendorong script
Johan
Tidak ... itu kernelnya sendiri, hidup dan secara langsung. Ini akan berfungsi bahkan jika Anda tidak menggunakan shell untuk menjalankan skrip ... ada cara lain untuk mengeksekusi file selain shell ... misalnya dari program C, menggunakan system call "exec"
JoelFan
en.wikipedia.org/wiki/Shebang_(Unix)#Magic_number "#!" di ascii adalah byte 0x23 0x21 - ketika exec () melihat byte ini, tingkah lakunya adalah memperlakukan sisa baris sebagai jalur ke penerjemah.
Aaron McMillin
1

Itu perlu komentar karena hanya dengan cara ini ia juga akan berfungsi untuk menjalankan skrip seperti "interpretername scriptname". Saya tidak tahu tentang asal usul "!".

Sven Geggus
sumber
1
Bahkan jika Anda hanya menjalankan ./scriptname, penerjemah masih melihat baris she-bang, jadi masih perlu komentar.
psusi
1
Atau lebih rinci: shebang: '#!' dirancang untuk tidak dilihat oleh penerjemah - oleh karena itu harus dimulai dengan komentar char '#'. Sebaliknya, ia 'dilihat' (dan ditafsirkan) oleh set kernel 'exec [lv] *' dari panggilan sistem.
arielf