Skrip Pertama

Shebang, chmod +x, dan cara menjalankan skrip shell.

Daftar isi

Skrip shell adalah berkas teks yang berisi rangkaian perintah bash dan dijalankan dari atas ke bawah, seolah-olah perintah itu diketik satu per satu di terminal. Topik ini membahas pembuatan skrip pertama, peran baris shebang, pemberian izin eksekusi dengan chmod +x, serta dua cara menjalankan skrip yang tersedia. Semua langkah dieksekusi di terminal sehingga setiap keluaran pada topik ini berasal dari percobaan nyata dan dapat diulang dengan hasil yang sama.

Berkas skrip dan baris shebang#

Skrip disimpan sebagai berkas teks biasa. Akhiran .sh lazim digunakan sebagai penanda bahwa berkas itu adalah skrip shell, meskipun bash tidak mensyaratkannya. Baris pertama sebuah skrip biasanya berupa shebang, yaitu tanda #! yang diikuti jalur penafsir (interpreter) yang akan memproses berkas tersebut. Bagi bash, baris ini hanyalah komentar, sedangkan kernel membacanya untuk menentukan program yang mengeksekusi berkas pada pemanggilan langsung.

Berkas skrip pertama diberi nama sapa.sh dan berisi dua perintah echo. Ketika isinya dijalankan oleh bash, keluarannya seperti berikut:

bash sapa.sh
#!/bin/bash
# Skrip pertama: menyapa dan menghitung sederhana

echo "Halo dari skrip shell"
echo "Tiga kali tujuh sama dengan $((3 * 7))"
text Keluaran
Halo dari skrip shell
Tiga kali tujuh sama dengan 21

Perintah echo mencetak argumennya ke keluaran standar, sedangkan $((3 * 7)) adalah ekspansi aritmetika yang menghitung hasil kali sebelum dicetak. Saat skrip berjalan, bash membacanya dari atas ke bawah dan mengeksekusi setiap barisnya tanpa perlu konfirmasi apa pun. Dua cara menjalankan skrip pada bagian berikutnya menggunakan berkas dengan struktur seperti ini.

Menjalankan skrip dengan bash#

Cara pertama menjalankan skrip adalah menyebut penafsirnya secara eksplisit. Perintah bash menerima nama berkas sebagai argumen, lalu membaca dan mengeksekusi isinya baris demi baris. Pada cara ini bit izin eksekusi tidak diperlukan karena yang dijalankan sebenarnya adalah perintah bash, bukan berkas skripnya.

bash
# folder kerja latihan
mkdir -p /tmp/kerja-skrip-pertama
# menyalin skrip ke folder kerja lalu masuk ke sana
cp sapa.sh /tmp/kerja-skrip-pertama/
cd /tmp/kerja-skrip-pertama
# menjalankan skrip dengan menyebut penafsirnya
bash sapa.sh
text Keluaran
Halo dari skrip shell
Tiga kali tujuh sama dengan 21

Keluarannya persis sama dengan percobaan pada bagian sebelumnya karena yang dieksekusi tetap isi berkas yang sama. Kelemahan cara ini ada pada penulisnya, yaitu penafsir harus diingat dan ditulis ulang setiap kali skrip dipanggil. Kesalahan yang lazim terjadi adalah memanggil skrip bash dengan sh. Pada banyak distribusi modern, sh merupakan tautan ke dash, yaitu shell yang lebih kecil dan tidak mendukung semua fitur bash, sehingga fitur bash di dalam skrip dapat gagal.

Memberi izin eksekusi dengan chmod#

Cara kedua menjadikan skrip dapat dipanggil seperti program biasa, yaitu dengan mengetik ./sapa.sh. Syaratnya satu, yaitu bit izin eksekusi pada berkas, yang ditambahkan dengan chmod +x. Tanpa bit tersebut, kernel menolak menjalankan berkasnya dan bash melaporkan kegagalannya:

bash
# memastikan mode awal tanpa bit eksekusi
chmod 644 sapa.sh
# mencoba menjalankan skrip tanpa izin eksekusi
./sapa.sh
text Keluaran
bash: line 19: ./sapa.sh: Permission denied

Pesan Permission denied berasal dari pemeriksaan izin di tingkat sistem, bukan dari isi skrip. Angka pada awal pesan adalah hitungan baris sesi terminal tempat percobaan ini dijalankan, sehingga angkanya berbeda antar sesi. Inti pesannya tetap penolakan terhadap ./sapa.sh. Tanda ./ di depan nama berkas menyatakan jalur ke folder saat ini, dan penulisan ini wajib karena folder saat ini tidak pernah ikut dicari oleh mekanisme pencarian perintah melalui PATH. Langkah berikut menambahkan bit eksekusi pada berkas, memeriksa hasilnya dengan stat, lalu memanggil skrip secara langsung:

bash
# menetapkan mode dasar yang pasti lalu menambahkan bit eksekusi
chmod 644 sapa.sh
chmod +x sapa.sh
stat -c '%A %a %n' sapa.sh
# skrip kini dapat dipanggil langsung
./sapa.sh
text Keluaran
-rwxr-xr-x 755 sapa.sh
Halo dari skrip shell
Tiga kali tujuh sama dengan 21

Mode 644 berubah menjadi 755, yaitu izin membaca untuk semua pihak, menulis untuk pemilik, dan eksekusi untuk semua pihak. Perintah stat menampilkan izin dalam notasi simbolik dan notasi oktal sekaligus sehingga perubahannya mudah diperiksa. Keluaran skripnya persis sama dengan dua cara sebelumnya karena isi berkasnya tidak berubah sama sekali.

Peran shebang pada eksekusi langsung#

Ketika ./sapa.sh dijalankan, proses yang mengeksekusi berkas itu bukan bash sesi saat ini, melainkan kernel. Kernel membaca dua byte pertama berkas, menemukan tanda #!, lalu menjalankan penafsir yang tertera dengan berkas skrip sebagai argumennya. Mekanisme inilah yang membuat skrip dapat dipanggil seperti program biasa tanpa menyebut bash di depannya.

Jalur pada shebang harus ditulis lengkap karena kernel tidak melakukan pencarian. Bentuk #!/bin/bash digunakan pada skrip untuk bash. Bentuk #!/usr/bin/env bash mencari bash melalui PATH dan menjadi pilihan umum untuk skrip yang harus berjalan di banyak sistem dengan letak bash yang berbeda-beda. Isi dua baris pertama skrip dapat diperiksa kapan saja untuk memastikan penafsirnya:

bash
# memeriksa dua baris pertama berkas skrip
head -n 2 sapa.sh
text Keluaran
#!/bin/bash
# Skrip pertama: menyapa dan menghitung sederhana

Perbedaan kedua bentuk shebang tersebut praktis ketika skrip dibagikan lintas sistem. Pada sistem yang menaruh bash di luar /bin, bentuk #!/bin/bash gagal dijalankan, sedangkan bentuk #!/usr/bin/env bash tetap menemukan bash selama program itu ada di PATH. Untuk latihan di satu mesin, kedua bentuk memberikan hasil yang sama.

Kesalahan umum#

  • Menyalahkan isi skrip ketika yang muncul adalah Permission denied. Pesan itu berarti bit izin eksekusi belum ada, sehingga perbaikannya adalah chmod +x nama.sh, bukan menyunting isi berkas.
  • Memanggil skrip dengan nama saja, misalnya sapa.sh tanpa ./, lalu gagal dengan command not found. Folder saat ini tidak termasuk PATH, sehingga skrip di folder saat ini harus dipanggil dengan ./sapa.sh atau bash sapa.sh.
  • Menaruh baris kosong atau komentar sebelum shebang. Kernel hanya membaca dua byte pertama berkas, sehingga tanda #! yang bergeser dari baris pertama tidak pernah terbaca.
  • Menuliskan shebang #!/bin/sh untuk skrip yang menggunakan fitur khusus bash seperti [[ ]] atau array. Skrip kemudian ditafsirkan oleh dash pada distribusi berbasis Debian dan berakhir dengan error sintaks.
  • Menyunting skrip di Windows tanpa mengubah akhiran baris. Karakter CR dari akhiran CRLF menempel pada jalur penafsir sehingga kernel mencari /bin/bash\r yang tidak ada, dan eksekusi langsung berakhir dengan error bad interpreter.

Ringkasan#

  • Skrip shell adalah berkas teks berisi perintah bash yang dieksekusi berurutan, dengan baris shebang sebagai penentu penafsir pada pemanggilan langsung.
  • bash sapa.sh menjalankan skrip tanpa syarat izin, sedangkan ./sapa.sh menuntut bit eksekusi yang ditambahkan lewat chmod +x.
  • chmod +x mengubah mode 644 menjadi 755, dan hasilnya diperiksa dengan stat -c '%A %a %n'.
  • Tanda ./ wajib pada pemanggilan langsung karena folder saat ini tidak termasuk daftar pencarian PATH.

Referensi#