Anda akan sering menemukan skrip shell yang dimulai dengan:
#!/bin/bash
Ini #!
disebut shebang atau hashbang. Shebang memainkan peran penting dalam skrip shell, khususnya saat menangani berbagai jenis shell.
Dalam tutorial ini, Anda akan belajar:
- Apa itu Shebang?
- Bagaimana peran penting dalam skrip shell?
Apa itu shebang dalam skrip shell?
Shebang adalah kombinasi dari # (kunci pound) dan ! (tanda seru). Kombinasi karakter ini memiliki arti khusus ketika digunakan pada baris pertama naskah. Ini digunakan untuk menentukan penerjemah yang dengannya skrip yang diberikan akan dijalankan secara default.
Jadi, jika baris pertama skrip adalah:
#!/bin/bash
Itu berarti penerjemah harus bash Shell. Jika baris pertama adalah:
#!/bin/zsh
Artinya interpreter yang akan digunakan adalah Z shell.
#! pasti istimewa karena # digunakan untuk komentar di skrip shell tetapi di sini memiliki arti khusus.
Mengapa shebang penting dalam skrip shell?
Inilah masalahnya. Shebang diikuti oleh shell yang dapat dieksekusi tidak wajib untuk skrip.
Jika Anda menulis skrip sederhana seperti ini:
echo "Namaste, folks!"
Dan berikan izin eksekusi dan jalankan dengan ekstensi . operator, itu akan dijalankan oleh shell login Anda.
[email protected]:~$ cat sample
echo "Namaste, folks!"
[email protected]:~$ chmod u+x sample
[email protected]:~$ ./sample
Namaste, folks!
Lalu mengapa skrip shell menyertakan baris #!/bin/bash di awal skrip?
Karena ada beberapa shell yang tersedia untuk sistem Linux dan UNIX. Sementara shell ini sebagian besar memiliki sintaks yang sama, mereka memiliki sintaks yang berbeda atau cara penanganan yang berbeda.
Inilah sebabnya mengapa menjadi penting untuk menentukan penerjemah shell yang benar dalam skrip, jika tidak, beberapa skrip dapat menghasilkan hasil yang berbeda ketika dijalankan di shell yang berbeda.
Biarkan saya menunjukkannya kepada Anda dengan contoh sederhana.
Pentingnya menentukan penerjemah shell dengan shebang
Saya telah menulis contoh skrip shell dengan array distribusi. Script kemudian menampilkan distro pada indeks 2.
distros=("Ubuntu" "Fedora" "SUSE" "Debian")
echo "Distro at index 2 is: ${distros[2]}"
Saya belum menambahkan baris Shebang untuk menentukan penerjemah Shell apa pun. Ini berarti ketika saya menjalankan skrip ini, skrip ini akan dijalankan oleh shell default (bash dalam kasus saya):
[email protected]:~$ echo $0
bash
Bisakah Anda menebak output dari skrip?
[email protected]:~$ ./arrays.sh
Distro at index 2 is: SUSE
Ini menunjukkan SUSE pada indeks 2 karena indeks array mulai dari 0 di Bash dan banyak bahasa pemrograman dan skrip lainnya. TAPI itu tidak terjadi di Z shell. Di shell Z, indeks array dimulai dari 1.
Saya telah menginstal Z shell di sistem saya. Saya mengubah skrip dan menambahkan baris Shebang untuk menentukan bahwa skrip harus dijalankan oleh Z shell secara default.
#!/bin/zsh
distros=("Ubuntu" "Fedora" "SUSE" "Debian")
echo "Distro at index 2 is: ${distros[2]}"
Bisakah Anda menebak hasilnya ketika saya menjalankan skrip sekarang?
[email protected]:~$ ./arrays.sh
Distro at index 2 is: Fedora
Apakah Anda melihat perbedaannya sekarang? Ini skrip yang sama tetapi penambahan baris Shebang membuat perbedaan.
Dan inilah mengapa menentukan penerjemah shell yang benar dengan operator Shebang itu penting. Sebagai sysadmin, Anda dapat menulis skrip shell dengan mengingat shell tertentu, baik itu bash, ksh atau zsh. Tetapi Anda tidak dapat memastikan bahwa sistem yang akan menjalankan skrip akan memiliki shell default yang sama dengan milik Anda. Sekarang semuanya masuk akal, bukan?
Shebang diabaikan jika Anda secara eksplisit menentukan shell
Mengapa saya menekankan pada shell "default"? Karena shebang menentukan penerjemah untuk menjalankan skrip.
Namun, Anda dapat menentukan shell secara eksplisit dan dalam kasus seperti itu, baris shebang akan diabaikan.
Bagaimana tepatnya shebang bekerja?
Saat Anda menggunakan shebang di baris pertama skrip, Anda memberi tahu shell untuk menjalankan skrip yang diberikan dengan perintah yang ditentukan.
Pada dasarnya, #!/bin/zsh
setara dengan:
/bin/zsh script_name
Saya telah memberi tahu Anda bahwa jika baris pertama skrip dimulai dengan Shebang, itu berarti Anda menentukan penerjemah Shell.
Itu hanya sebagian benar. Sebenarnya, itulah tujuan dari karakter shebang. Tetapi garis Shebang tidak harus memiliki shell yang dapat dieksekusi. Itu bisa apa saja.
Misalnya, saya akan mengganti #!/bin/zsh
dengan #!/bin/cat
. /bin/cat adalah eksekusi dari perintah cat.
#!/bin/cat
distros=("Ubuntu" "Fedora" "SUSE" "Debian")
echo "Distro at index 2 is: ${distros[2]}"
Artinya sekarang skrip ini akan dijalankan dengan cat
perintah dan tampilkan konten skrip.
Ini akan berfungsi selama itu menunjuk ke perintah yang dapat dieksekusi. Jika Anda meletakkan beberapa hal acak, itu akan menimbulkan kesalahan.
Saya mengubah baris Shebang menjadi:
#!/home/abhishek
Jelas, itu tidak menunjuk ke eksekusi perintah apa pun dan dengan demikian menimbulkan kesalahan penerjemah yang buruk.
[email protected]:~$ cat arrays.sh
#!/home/abhishek
distros=("Ubuntu" "Fedora" "SUSE" "Debian")
echo "Distro at index 2 is: ${distros[2]}"
[email protected]:~$ ./arrays.sh
bash: ./arrays.sh: /home/abhishek: bad interpreter: Permission denied
Kesimpulan
Biarkan saya menjawab beberapa pertanyaan lagi sebelum mengakhiri artikel ini:
- Penting agar tidak ada spasi di antara
#
dan!
. Anda TIDAK BISA menggunakannya seperti ini:# !/bin/bash
. - Sebagian besar sistem memungkinkan ruang antara
#!
dan/bin/bash
namun merupakan praktik yang baik untuk menghindari spasi di antara#!
dan/bin/bash
. #!
harus berada di baris pertama, jika tidak, baris Shebang akan diperlakukan sebagai komentar. Anda bahkan tidak dapat memiliki baris kosong sebelumnya.
Saya harap Anda lebih memahami mengapa #! digunakan di awal skrip shell di Linux. Jangan ragu untuk meninggalkan komentar jika Anda memiliki pertanyaan atau saran.