Setiap perintah yang selesai di Linux meninggalkan satu angka sebagai laporan hasil kerjanya — angka itu disebut exit code. Angka nol berarti sukses, selain nol berarti gagal dengan alasan tertentu. Kita sudah memanfaatkannya secara tidak langsung lewat operator && dan ||; sekarang kita membaca angkanya sendiri lewat $?, mengatur angkanya dari skrip, dan memakainya sebagai dasar pengambilan keputusan. Pemahaman inilah yang menghubungkan seluruh kejayaan command line dengan shell scripting.
Membaca Status dengan $? #
Variabel khusus $? selalu berisi exit code dari perintah yang baru saja selesai. Perintah true tidak melakukan apa pun selain keluar dengan kode nol, dan false kebalikannya — pasangan ini membuat perilaku $? mudah diamati:
echo "halo"
echo "setelah echo : $?"
true
echo "setelah true : $?"
false
echo "setelah false: $?"Output yang Dihasilkan:
halo
setelah echo : 0
setelah true : 0
setelah false: 1echo berhasil mencetak teks sehingga laporan berikutnya bernilai 0; true juga 0; false sengaja gagal sehingga tercatat 1. Sekarang kasus gagal yang sesungguhnya — memanggil ls pada file yang tidak ada, dengan pesannya kita alihkan ke stdout agar ikut terekam:
ls file-tidak-ada 2>&1
echo "setelah ls: $?"Output yang Dihasilkan:
ls: cannot access 'file-tidak-ada': No such file or directory
setelah ls: 2Perintah ls gagal dengan kode 2 dan meninggalkan pesan penjelasan di stderr. Pesan seperti itu untuk manusia, sedangkan exit code untuk program — skrip kita nantinya cukup memeriksa angkanya tanpa perlu mengurai teks pesannya.
Konvensi Nol dan Bukan Nol #
Arah logikanya memang terasa terbalik: nol sukses, selain nol gagal. Alasannya praktis — ada banyak cara gagal tetapi hanya satu cara sukses, sehingga angka positif dipakai membedakan jenis kegagalannya. Kode yang paling sering ditemui:
| Exit code | Arti |
|---|---|
| 0 | sukses |
| 1 | kegagalan umum |
| 2 | salah pakai perintah atau file tidak ditemukan (kebiasaan ls) |
| 126 | perintah ada tapi tidak bisa dijalankan |
| 127 | perintah tidak ditemukan |
Kode 127 sudah pernah kita jumpai pada Chapter Pengenalan Terminal: ecoh yang salah ketik dibalas command not found — dan exit code-nya persis 127. Daftar lengkap konvensinya dibahas pada bagian Exit Status di halaman manual bash(1)
.
Mengatur Exit Code dari Skrip #
Skrip juga wajib melapor. Tanpa exit eksplisit, exit code skrip adalah kode perintah terakhirnya; perintah exit angka memungkinkan kita memilih sendiri. Blok berikut menulis skrip kecil lewat heredoc, menjalankannya, lalu membaca laporannya:
cat > cek.sh <<'AKHIR'
#!/bin/bash
echo "memeriksa konfigurasi"
exit 42
AKHIR
bash cek.sh
echo "exit code skrip: $?"Output yang Dihasilkan:
memeriksa konfigurasi
exit code skrip: 42Mari kita bedah isi skrip cek.sh baris per barisnya:
- Baris 1 (
#!/bin/bash): shebang, penanda bahwa file ini dijalankan olehbash; baru relevan saat file dipanggil langsung sebagai./cek.sh. - Baris 2 (
echo ...): mencetak pesan kemajuan seperti biasa ke stdout. - Baris 3 (
exit 42): mengakhiri skrip seketika dengan kode42— angka bebas selain nol untuk menandai kegagalan versi kita sendiri.
Angka 42 lalu muncul di $? pada shell pemanggilnya, terbukti di baris terakhir blok. Inilah jalur resmi bagaimana skrip berkomunikasi hasil kerjanya ke pemanggil, dan konvensi 0 sukses itulah yang membuat operator && serta || dari Chapter Command Chaining bekerja.
Exit Code dari Fungsi dan Pengambilan Keputusan #
Fungsi shell melapor lewat return — atau lewat exit code perintah terakhirnya bila tanpa return. Kombinasikan dengan && dan ||, kita mendapat alat keputusan yang ringkas:
cek_file() {
[ -f "$1" ]
}
printf 'catatan\n' > log.txt
cek_file log.txt && echo "log.txt ada"
cek_file hilang.txt || echo "hilang.txt tidak ada"Output yang Dihasilkan:
log.txt ada
hilang.txt tidak adaFungsi cek_file hanya memanggil uji [ -f "$1" ]: bernilai sukses bila argumennya adalah file yang ada, gagal bila tidak — dan exit code uji itulah yang menjadi laporan fungsi. Pemanggilan pertama menemukan log.txt sehingga cabang && berjalan; pemanggilan kedua gagal sehingga cabang || yang mengambil alih. Pola ini adalah cikal bakal blok if yang akan kita dalami di Section Shell dan Scripting.
Dengan exit code, seluruh perintah, skrip, dan fungsi kini berbicara satu bahasa laporan yang seragam. Perjalanan kita di command line lengkap sudah: saatnya melihat peta besar tempat semua file itu hidup — pohon direktori Linux, dibuka oleh Section Filesystem pada Chapter Struktur Filesystem Linux.