Perintah yang diketik berulang adalah kandidat kuat untuk dijadikan skrip. Skrip hanyalah file teks berisi rangkaian perintah; bash membacanya baris demi baris dan menjalankannya persis seperti saat kita mengetik sendiri. Chapter ini menulis skrip pertama, membedah baris pembukanya, lalu membandingkan tiga cara menjalankan skrip — sampai skrip dapat dipanggil langsung dengan namanya.

Skrip Pertama: salam.sh #

Kita memakai heredoc dari Chapter Exit Codes: cat > salam.sh mengarahkan tulisan ke file, dan penanda << 'AKHIR' (dengan kutip) membuat bash menyalin teks apa adanya sampai baris AKHIR:

bash
cat > salam.sh << 'AKHIR'
#!/bin/bash
# salam.sh -- skrip pertama kita
echo "Halo dari skrip!"
exit 0
AKHIR
bash salam.sh
echo "exit code: $?"

Output yang Dihasilkan:

text
Halo dari skrip!
exit code: 0

Mari kita bedah isi salam.sh baris per barisnya:

  1. Baris 1 (#!/bin/bash): shebang — tanda pagar dan seru di posisi paling awal file. Saat file dieksekusi langsung, kernel membaca baris ini untuk tahu program mana yang harus menjalankan file: /bin/bash. Lewat bash salam.sh, baris ini hanya menjadi komentar biasa.
  2. Baris 2 (# salam.sh -- ...): komentar — semua teks setelah # sampai akhir baris diabaikan bash. Bash tidak punya komentar blok, jadi setiap baris komentar diawali #.
  3. Baris 3 (echo ...): isi skrip yang sesungguhnya; perintah yang sama dengan yang biasa kita ketik interaktif.
  4. Baris 4 (exit 0): mengakhiri skrip dengan laporan sukses. Tanpa baris ini, exit code skrip adalah exit code perintah terakhirnya — kebiasaan menutup dengan exit 0 membuat niat kita eksplisit.

Baris terakhir blok membuktikannya: $? bernilai 0 sesuai konvensi Chapter Exit Codes.

Eksekusi Langsung: chmod +x dan ./salam.sh #

File baru yang dibuat lewat heredoc tidak punya izin eksekusi, jadi dipanggil langsung akan ditolak. Perintah chmod +x menambahkan izin tersebut — dan stat -c '%a' menampilkan izin file dalam angka oktal. Baris umask 022 meniru bawaan kebanyakan distro agar izin awal file konsisten:

bash
umask 022
cat > salam.sh << 'AKHIR'
#!/bin/bash
echo "Halo dari skrip!"
AKHIR
echo "-- mencoba langsung --"
./salam.sh 2>&1
echo "-- setelah chmod +x --"
chmod +x salam.sh
stat -c '%a' salam.sh
./salam.sh

Output yang Dihasilkan:

text
-- mencoba langsung --
bash: ./salam.sh: Permission denied
-- setelah chmod +x --
755
Halo dari skrip!

Pemanggilan pertama ditolak Permission denied dengan exit code 126 — kode “ada tapi tidak bisa dijalankan” dari tabel exit codes. Setelah chmod +x, izin berubah dari 644 (baca-tulis pemilik, baca lainnya) menjadi 755 (ditambah eksekusi) dan ./salam.sh berjalan. Tanda ./ penting: bash mencari perintah hanya di PATH, sedangkan ./ berarti “di folder ini”.

Cara bash salam.sh tetap sah tanpa chmod karena yang dieksekusi adalah bash — file skripnya hanya bahan baca. Shebang di baris pertama baru berperan pada pemanggilan langsung ./salam.sh.

bash, ./, dan source: Siapa yang Menjalankan Skrip #

Perbedaan penting ketiganya ada pada proses yang menjalankan perintah di dalam skrip. bash skrip.sh dan ./skrip.sh memunculkan proses bash baru (child), sedangkan source skrip.sh menjalankan isinya di shell yang sedang berjalan sekarang. Konsekuensinya terlihat pada variabel:

bash
cat > setvar.sh << 'AKHIR'
#!/bin/bash
nama="Budi"
AKHIR
bash setvar.sh
echo "setelah bash  : nama='$nama'"
source setvar.sh
echo "setelah source: nama='$nama'"

Output yang Dihasilkan:

text
setelah bash  : nama=''
setelah source: nama='Budi'

Skrip setvar.sh hanya berisi satu penugasan variabel. Setelah bash setvar.sh, variabel nama di shell kita tetap kosong — penugasan itu hidup dan mati di proses anak. Setelah source setvar.sh, variabel nama terisi di shell aktif karena tidak ada proses baru. Titik (.) adalah kependekan source; justru karena perilaku inilah ~/.bashrc dimuat ulang dengan source.

Komentar, Nama File, dan Skrip di PATH #

Konvensi penamaan skrip sederhana: huruf kecil, tanpa spasi, berakhiran .sh sebagai penanda bagi manusia — sistem tidak memedulikan akhiran ini. backup-harian.sh jelas lebih terbaca daripada SKRIP BARU. Sebaliknya, perintah sungguhan di PATH seperti ls dan grep tidak berakhiran apa pun — pola itu kita tiru nanti.

Agar skrip dapat dipanggil dari folder mana pun, kita sisipkan foldernya ke depan PATH — daftar folder tempat bash mencari perintah:

bash
mkdir -p bin
cat > bin/salam << 'AKHIR'
#!/bin/bash
echo "halo dari PATH"
AKHIR
chmod +x bin/salam
PATH="$PWD/bin:$PATH" salam

Output yang Dihasilkan:

text
halo dari PATH

Mari kita bedah baris-baris terakhirnya:

  1. Baris 1 (mkdir -p bin): membuat folder bin di folder aktif; -p membuat perintah aman diulang.
  2. Baris 4 (chmod +x bin/salam): skrip di PATH wajib eksekusi karena akan dipanggil langsung dengan namanya.
  3. Baris 5 (PATH="$PWD/bin:$PATH" salam): prefiks PATH=... menetapkan variabel hanya untuk satu perintah — bukan permanen — sehingga salam dicari dulu di $PWD/bin sebelum folder-folder bawaan.

Untuk pemakaian permanen, letakkan skrip di ~/.local/bin (umumnya sudah masuk PATH lewat ~/.profile) atau tambahkan export PATH=... di ~/.bashrc. Topik eksekusi perintah dibahas lengkap di bagian COMMAND EXECUTION halaman manual bash(1) .

Skrip pertama kini bisa dibuat, dijalankan tiga cara, dan dipanggil dari PATH. Skrip sejati butuh data yang berubah — untuk itu kita berkenalan dengan variabel di Chapter Variables dan Quoting.