The #!
line digunakan sebelum script dijalankan, maka diabaikan ketika script berjalan.
Anda bertanya apa perbedaan antara garis shebang dan komentar biasa.
Baris yang diawali dengan #!
komentar sama banyaknya dengan baris lain yang dimulai #
. Ini benar jika #!
ini adalah baris pertama file, atau di mana saja. #!/bin/sh
memiliki efek , tetapi tidak dibaca oleh penerjemah itu sendiri .
#
bukan komentar dalam semua bahasa pemrograman tetapi, seperti yang Anda tahu, ini adalah komentar di shell gaya Bourne termasuk sh
dan bash
(serta sebagian besar shell gaya non-Bourne, seperti csh
). Ini juga komentar dalam Python . Dan itu adalah komentar dalam berbagai file konfigurasi yang sebenarnya bukan skrip (seperti /etc/fstab
).
Misalkan skrip shell dimulai dengan #!/bin/sh
. Itu adalah komentar, dan penerjemah (shell) mengabaikan semua yang ada di baris setelah #
karakter.
Tujuan dari suatu #!
garis bukanlah untuk memberikan informasi kepada penerjemah. Tujuan dari #!
jalur ini adalah untuk memberi tahu sistem operasi (atau proses apa pun yang meluncurkan penerjemah) apa yang harus digunakan sebagai penerjemah .
Jika Anda menjalankan skrip sebagai file yang dapat dieksekusi, misalnya, dengan menjalankan ./script.sh
, sistem berkonsultasi dengan baris pertama untuk melihat apakah dimulai dengan #!
, diikuti oleh nol atau lebih banyak ruang, diikuti oleh perintah. Jika ya, ia menjalankan perintah itu dengan nama skrip sebagai argumennya. Dalam contoh ini, ini berjalan /bin/sh script.sh
(atau, secara teknis, /bin/sh ./script.sh
).
Jika Anda mengaktifkan skrip dengan secara eksplisit memanggil juru bahasa, #!
garis itu tidak pernah dikonsultasikan. Jadi, jika Anda menjalankan sh script.sh
, baris pertama tidak berpengaruh. Jika script2.sh
baris pertama adalah #!/usr/games/nibbles
, menjalankan sh script2.sh
tidak akan mencoba membuka skrip di nibbles
(tetapi ./script2.sh
akan).
Anda akan melihat bahwa dalam kedua kasus itu ekstensi skrip ( .sh
), jika ada, berdampak pada bagaimana skrip dijalankan. Dalam sistem seperti Unix, ini biasanya tidak mempengaruhi bagaimana skrip dijalankan. Pada beberapa sistem lain, seperti Windows, #!
garis shebang mungkin diabaikan sepenuhnya oleh sistem, dan ekstensi mungkin menentukan apa yang menjalankan skrip. (Ini tidak berarti Anda harus memberikan ekstensi skrip Anda, tetapi itu adalah salah satu alasan mengapa jika Anda melakukannya, itu harus benar.)
#!
dipilih untuk melayani tujuan ini justru karena #
memulai komentar. The #!
line untuk sistem, tidak interpreter, dan itu harus diabaikan oleh interpreter.
Garis Shebang untuk Skrip Bash
Anda (awalnya) mengatakan Anda gunakan #!/bin/sh
untuk bash
skrip. Anda hanya harus melakukan itu jika skrip tidak memerlukan bash
ekstensi apa pun - sh
harus dapat menjalankan skrip. sh
tidak selalu merupakan symlink ke bash
. Seringkali, termasuk pada semua sistem Debian dan Ubuntu terbaru dari jarak jauh , sh
adalah symlink ke dash
.
Baris Shebang untuk Skrip Python
Anda juga mengatakan (dalam versi pertama pertanyaan Anda, sebelum diedit) bahwa Anda memulai skrip Python Anda #!/bin/sh read by the interpretor
. Jika Anda benar-benar bermaksud demikian, maka Anda harus berhenti melakukannya. Jika hello.py
dimulai dengan baris itu, menjalankan ./hello.py
dijalankan:
/bin/sh read by the interpretor hello.py
/bin/sh
akan mencoba untuk mengeksekusi skrip yang disebut read
(dengan by the interpretor hello.py
argumennya), tidak read
akan (semoga) tidak ditemukan, dan skrip Python Anda tidak akan pernah dilihat oleh juru bahasa Python.
Jika Anda membuat kesalahan ini tetapi tidak memiliki masalah yang saya jelaskan, Anda mungkin menggunakan skrip Python Anda dengan secara eksplisit menentukan penerjemah (mis., python hello.py
), Sehingga baris pertama diabaikan. Saat Anda mendistribusikan skrip Anda ke orang lain, atau menggunakannya beberapa saat kemudian, mungkin tidak jelas bahwa ini perlu bagi mereka untuk bekerja. Yang terbaik untuk memperbaikinya sekarang. Atau setidaknya menghapus baris pertama sepenuhnya, sehingga ketika mereka gagal dijalankan dengan ./
pesan kesalahan akan masuk akal.
Untuk skrip Python, jika Anda tahu di mana juru bahasa Python berada (atau akan menjadi), Anda dapat menulis #!
baris dengan cara yang sama:
#!/usr/bin/python
Atau, jika skrip Python 3, Anda harus menentukan python3
, karena python
hampir selalu Python 2 :
#!/usr/bin/python3
Namun, masalahnya adalah bahwa sementara /bin/sh
seharusnya selalu ada, dan /bin/bash
hampir selalu ada pada sistem di mana bash
datang dengan OS, Python mungkin ada di berbagai tempat.
Oleh karena itu, banyak programmer Python yang menggunakan ini:
#!/usr/bin/env python
(Atau #!/usr/bin/env python3
untuk Python 3.)
Ini membuat skrip mengandalkan env
berada di "tempat yang tepat" daripada mengandalkan python
berada di tempat yang tepat. Itu hal yang baik, karena:
env
hampir selalu terletak di /usr/bin
.
- Pada sebagian besar sistem, mana yang
python
harus menjalankan skrip Anda adalah yang muncul pertama kali di PATH
. Dimulai hello.py
dengan #!/usr/bin/env python
make ./hello.py
run /usr/bin/env python hello.py
, yang (hampir) setara dengan running python hello.py
.
Alasan Anda tidak dapat menggunakan #!python
adalah:
- Anda ingin penerjemah yang ditentukan diberikan oleh jalur absolut (yaitu, dimulai dengan
/
).
- Proses panggilan akan dijalankan
python
di direktori saat ini . Mencari path ketika perintah tidak mengandung garis miring adalah perilaku shell tertentu.
Kadang-kadang sebuah Python atau skrip lain yang bukan skrip shell akan memiliki garis shebang dimulai dengan di #!/bin/sh ...
mana ...
beberapa kode lainnya. Ini kadang-kadang benar, karena ada beberapa cara untuk memanggil shell Bourne-compatible ( sh
) dengan argumen untuk membuatnya memanggil juru bahasa Python. (Salah satu argumen mungkin akan berisi python
.) Namun, untuk sebagian besar tujuan, #!/usr/bin/env python
lebih sederhana, lebih elegan, dan lebih mungkin untuk bekerja seperti yang Anda inginkan.
Garis Shebang dalam Bahasa Lainnya
Banyak bahasa pemrograman dan skrip, dan beberapa format file lainnya, digunakan #
sebagai komentar. Untuk salah satu dari mereka, file dalam bahasa dapat dijalankan oleh program yang menganggapnya sebagai argumen dengan menentukan program di baris pertama setelahnya #!
.
Dalam beberapa bahasa pemrograman, #
biasanya bukan komentar, tetapi sebagai kasus khusus, baris pertama diabaikan jika dimulai dengan #!
. Ini memfasilitasi penggunaan #!
sintaks meskipun #
tidak membuat baris komentar.
Garis Shebang untuk File yang Tidak Berjalan Sebagai Skrip
Meskipun kurang intuitif, file apa pun yang format file dapat mengakomodasi baris pertama dimulai dengan #!
diikuti oleh path lengkap dari executable dapat memiliki garis shebang. Jika Anda melakukan ini, dan file ditandai dapat dieksekusi, maka Anda dapat menjalankannya seperti sebuah program ... menyebabkannya dibuka seperti dokumen.
Beberapa aplikasi menggunakan perilaku ini dengan sengaja. Misalnya, di VMware, .vmx
file menentukan mesin virtual. Anda dapat "menjalankan" mesin virtual seolah-olah itu adalah skrip karena file-file ini ditandai dapat dieksekusi dan memiliki garis shebang yang menyebabkan mereka dibuka dalam utilitas VMware.
Garis Shebang untuk File yang Tidak Berjalan sebagai Skrip tetapi Bertindak Seperti Skrip
rm
menghapus file. Ini bukan bahasa scripting. Namun, file yang dimulai #!/bin/rm
dan ditandai dapat dieksekusi dapat dijalankan, dan ketika Anda menjalankannya, rm
dipanggil, dihapus.
Ini sering dikonseptualisasikan sebagai "file menghapus dirinya sendiri." Tetapi file tersebut tidak benar-benar berjalan sama sekali. Ini lebih seperti situasi yang dijelaskan di atas untuk .vmx
file.
Namun, karena #!
baris memfasilitasi jalannya perintah sederhana (termasuk argumen baris perintah), Anda dapat melakukan beberapa skrip dengan cara ini. Sebagai contoh sederhana dari "skrip" yang lebih canggih daripada #!/bin/rm
, pertimbangkan:
#!/usr/bin/env tee -a
Ini mengambil input pengguna secara interaktif, menggaungkannya kembali ke baris demi baris pengguna, dan menambahkannya ke akhir file "skrip".
Berguna? Tidak terlalu. Secara konseptual menarik? Sama sekali! Iya. (Agak.)
Konsep Pemrograman / Skrip yang Mirip (hanya untuk bersenang-senang)
#include
. Di sana juga,#
itu tidak dimaksudkan sebagai komentar.