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:
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:
Halo dari skrip!
exit code: 0Mari kita bedah isi salam.sh baris per barisnya:
- 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. Lewatbash salam.sh, baris ini hanya menjadi komentar biasa. - Baris 2 (
# salam.sh -- ...): komentar — semua teks setelah#sampai akhir baris diabaikan bash. Bash tidak punya komentar blok, jadi setiap baris komentar diawali#. - Baris 3 (
echo ...): isi skrip yang sesungguhnya; perintah yang sama dengan yang biasa kita ketik interaktif. - Baris 4 (
exit 0): mengakhiri skrip dengan laporan sukses. Tanpa baris ini, exit code skrip adalah exit code perintah terakhirnya — kebiasaan menutup denganexit 0membuat 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:
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.shOutput yang Dihasilkan:
-- 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:
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:
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:
mkdir -p bin
cat > bin/salam << 'AKHIR'
#!/bin/bash
echo "halo dari PATH"
AKHIR
chmod +x bin/salam
PATH="$PWD/bin:$PATH" salamOutput yang Dihasilkan:
halo dari PATHMari kita bedah baris-baris terakhirnya:
- Baris 1 (
mkdir -p bin): membuat folderbindi folder aktif;-pmembuat perintah aman diulang. - Baris 4 (
chmod +x bin/salam): skrip diPATHwajib eksekusi karena akan dipanggil langsung dengan namanya. - Baris 5 (
PATH="$PWD/bin:$PATH" salam): prefiksPATH=...menetapkan variabel hanya untuk satu perintah — bukan permanen — sehinggasalamdicari dulu di$PWD/binsebelum 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.