Apa arti baris "#! / Bin / sh" dalam skrip shell UNIX?

142

Saya telah melalui beberapa tutorial skrip shell dan menemukan contoh program berikut:

#!/bin/sh
clear
echo "HELLO WORLD"

Adakah yang bisa memberi tahu saya apa pentingnya komentar #!/bin/shdi awal?

Jake
sumber
2
Shebang
drootang
2
Penjelasan yang bagus tentang askubuntu: askubuntu.com/questions/141928/…
fkoessler

Jawaban:

143

Ini disebut a shebang , dan memberi tahu induk shell yang mana juru bahasa harus digunakan untuk mengeksekusi skrip.

misalnya

#!/usr/bin/perl   <--perl script'
#!/usr/bin/php <-- php script
#!/bin/false <--- do-nothing script, because false returns immediately anyways.

Ini diterapkan sebagai komentar sehingga apa pun yang masuk dalam baris itu tidak akan "relevan" dengan juru bahasa yang ditentukan. mis. semua bahasa scripting cenderung memahami bahwa baris yang dimulai dengan #adalah komentar, dan akan mengabaikan !/usr/bin/whateverbagiannya, yang mungkin merupakan kesalahan sintaksis dalam bahasa tersebut.

Marc B
sumber
6
Biasanya kernel, bukan shell, yang memproses ini. Shell hanya memanggil panggilan exec()sistem pada file.
tripleee
47

Ketika Anda mencoba menjalankan sebuah program di unix (satu dengan bit set yang dapat dieksekusi), sistem operasi akan melihat beberapa byte pertama dari file tersebut. Ini membentuk apa yang disebut "angka ajaib", yang dapat digunakan untuk memutuskan format program dan cara menjalankannya.

#!sesuai dengan angka ajaib 0x2321 (lihat di tabel ascii). Ketika sistem melihat nomor ajaib itu, ia tahu bahwa ia berurusan dengan skrip teks dan membaca hingga yang berikutnya\n (ada batasnya, tetapi itu lolos dari saya atm). Setelah mengidentifikasi penerjemah (argumen pertama setelah shebang) itu akan memanggil penerjemah.

File lain juga memiliki angka ajaib. Coba lihat file bitmap (.BMP) via lessdan Anda akan melihat dua karakter pertama BM. Angka ajaib ini menunjukkan bahwa file tersebut memang bitmap.

Foo Bah
sumber
10

Jika file yang digunakan skrip ini dapat dieksekusi, hash-bang ( #!) memberi tahu sistem operasi apa penerjemah yang akan digunakan untuk menjalankan skrip. Dalam hal ini /bin/sh, misalnya.

Ada artikel Wikipedia tentangnya untuk informasi lebih lanjut.

Kusalananda
sumber
5

Baris pertama memberi tahu shell bahwa jika Anda menjalankan skrip secara langsung (./run.sh; sebagai lawan dari / bin / sh run.sh), ia harus menggunakan program itu (/ bin / sh dalam kasus ini) untuk menafsirkannya.

Anda juga dapat menggunakannya untuk meneruskan argumen, biasanya -e (keluar saat kesalahan), atau menggunakan program lain (/ bin / awk, / usr / bin / perl, dll).

Kevin
sumber
-4

#!/bin/shatau #!/bin/bashharus menjadi baris pertama skrip karena jika Anda tidak menggunakannya pada baris pertama maka sistem akan memperlakukan semua perintah dalam skrip tersebut sebagai perintah yang berbeda. Jika baris pertama adalah #!/bin/shmaka akan menganggap semua perintah sebagai satu skrip dan itu akan menunjukkan bahwa file ini berjalan dalam psperintah dan bukan perintah di dalam file.

./echo.sh

ps -ef |grep echo
trainee   3036  2717  0 16:24 pts/0    00:00:00 /bin/sh ./echo.sh
root      3042  2912  0 16:24 pts/1    00:00:00 grep --color=auto echo
Sarvesh Pawar
sumber
1
Stack Overflow bukan Twitter. Luangkan waktu untuk benar-benar mengeja kata-kata seperti "u" dan "1". Anda membantu menulis buku referensi sehingga tata bahasa dan ejaan yang tepat sangat penting. Juga, perhatikan pemformatan yang tepat. Perintah yang akan dikeluarkan dari baris perintah, seperti ps, dan kutipan kode seperti #!/bin/shharus diformat.
the Tin Man
Saya mencoba untuk membersihkan bahasa Inggris di sini tetapi saya masih tidak yakin apa artinya. Saya kira jawabannya mencoba untuk mengatakan bahwa perintah dalam skrip akan dieksekusi sebagai perintah yang berbeda dan menambahkan shebang akan menunjukkan skrip sebagai satu perintah dalam daftar proses. Ini sebenarnya tidak benar.
tripleee