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 shdan 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.shbaris pertama adalah #!/usr/games/nibbles, menjalankan sh script2.shtidak akan mencoba membuka skrip di nibbles(tetapi ./script2.shakan).
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/shuntuk bashskrip. Anda hanya harus melakukan itu jika skrip tidak memerlukan bashekstensi apa pun - shharus dapat menjalankan skrip. shtidak selalu merupakan symlink ke bash. Seringkali, termasuk pada semua sistem Debian dan Ubuntu terbaru dari jarak jauh , shadalah 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.pydimulai dengan baris itu, menjalankan ./hello.pydijalankan:
/bin/sh read by the interpretor hello.py
/bin/shakan mencoba untuk mengeksekusi skrip yang disebut read(dengan by the interpretor hello.pyargumennya), tidak readakan (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 pythonhampir selalu Python 2 :
#!/usr/bin/python3
Namun, masalahnya adalah bahwa sementara /bin/shseharusnya selalu ada, dan /bin/bashhampir selalu ada pada sistem di mana bashdatang 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 python3untuk Python 3.)
Ini membuat skrip mengandalkan envberada di "tempat yang tepat" daripada mengandalkan pythonberada di tempat yang tepat. Itu hal yang baik, karena:
envhampir 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.pydengan #!/usr/bin/env pythonmake ./hello.pyrun /usr/bin/env python hello.py, yang (hampir) setara dengan running python hello.py.
Alasan Anda tidak dapat menggunakan #!pythonadalah:
- 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 pythonlebih 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, .vmxfile 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
rmmenghapus file. Ini bukan bahasa scripting. Namun, file yang dimulai #!/bin/rmdan ditandai dapat dieksekusi dapat dijalankan, dan ketika Anda menjalankannya, rmdipanggil, 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 .vmxfile.
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.