Setiap kali kita mengetik perintah di layar hitam bertuliskan kursor berkedip, sebenarnya ada beberapa lapisan sistem yang bekerja sama di baliknya. Bab ini membuka series "Panduan Bash Scripting: Untuk User & Sysadmin" dengan meluruskan dasar yang paling sering tertukar: apa itu shell, terminal, dan Bash, kenapa kemampuan menulis script Bash begitu berharga baik di desktop maupun di server, bagaimana menyiapkan lingkungan kerja di Linux, macOS, dan WSL, sampai cara menjalankan script Bash pertama kita. Setelah menuntaskan bab ini, kita akan punya fondasi yang cukup kuat untuk masuk ke Bab 2 tentang navigasi filesystem.
1.1 Shell, Terminal, dan Bash: Apa Bedanya?
Tiga istilah ini sering dipakai bergantian padahal maknanya berbeda. Kesalahpahaman ini wajar karena ketiganya memang saling terkait erat dan sama-sama muncul di layar yang sama. Memahami perbedaannya sejak awal akan memudahkan kita membaca dokumentasi dan troubleshooting di bab-bab selanjutnya.
1.1.1 Kernel, Shell, dan Terminal
Kernel adalah inti sistem operasi yang mengatur akses langsung ke hardware: CPU, memori, disk, dan perangkat lain. Kernel tidak punya antarmuka yang bisa langsung kita ajak bicara dengan mengetik perintah.
Shell adalah program penerjemah antara manusia dan kernel. Shell membaca perintah yang kita ketik, menafsirkannya, lalu meminta kernel menjalankan aksi yang sesuai. Bash, zsh, dan fish semuanya adalah shell. Secara teknis, shell hanyalah program biasa seperti program lain di sistem, hanya saja fungsinya khusus untuk menerima dan mengeksekusi perintah.
Terminal (lebih tepatnya terminal emulator) adalah aplikasi jendela yang menampilkan teks masukan dan keluaran dari shell. GNOME Terminal, Konsole, iTerm2, dan Windows Terminal adalah contoh terminal emulator. Terminal sendiri tidak memproses perintah apa pun, ia hanya jadi "wadah" tempat shell berjalan dan menampilkan hasilnya ke layar.
Ringkasnya, alurnya seperti ini: kita mengetik di terminal, terminal meneruskan input tersebut ke shell yang berjalan di dalamnya, shell menafsirkan perintah lalu berkomunikasi dengan kernel untuk mengeksekusinya, dan terminal menampilkan kembali hasilnya di layar.
Istilah command-line interface (CLI) sendiri merujuk pada konsep antarmuka berbasis teks secara umum, di mana kita berinteraksi dengan sistem lewat perintah tertulis, berbeda dengan graphical user interface (GUI) yang mengandalkan klik dan visual. Shell adalah salah satu implementasi CLI yang paling umum di Linux dan Unix.
1.1.2 Bash vs sh, zsh, dan fish
Brian Fox mengembangkan Bash, singkatan dari Bourne Again SHell, untuk GNU Project pada tahun 1989 sebagai pengganti gratis dan bebas lisensi untuk Bourne shell (sh) yang lebih dulu ada. Nama "Bash" sendiri adalah plesetan dari nama pendahulunya. Bash menjadi shell default di hampir semua distribusi Linux serta di WSL, dan mengikuti standar POSIX (Portable Operating System Interface) sambil menambahkan banyak fitur ekstra seperti array, pengujian kondisi dengan [[ ]], dan brace expansion. sh sebenarnya bukan nama satu shell tertentu, melainkan istilah generik untuk "POSIX shell" atau merujuk pada Bourne shell asli buatan Stephen Bourne tahun 1979. Di banyak distro berbasis Debian seperti Ubuntu, /bin/sh adalah symlink ke dash (Debian Almquist Shell), bukan ke Bash, karena dash lebih ringan dan lebih cepat untuk menjalankan script yang murni POSIX. Ini penting diingat karena script yang mengandalkan fitur khas Bash bisa gagal jika dijalankan lewat sh.
Paul Falstad mengembangkan zsh (Z shell) pada tahun 1990. zsh kompatibel dengan Bash pada level dasar namun menawarkan banyak fitur tambahan untuk kustomisasi, seperti sistem plugin dan tema lewat framework populer Oh My Zsh. Sejak Apple merilis macOS Catalina (versi 10.15) pada tahun 2019, zsh menjadi shell default di macOS, menggantikan Bash.
Axel Liljencrantz membuat fish (Friendly Interactive Shell) pada tahun 2005 dengan filosofi berbeda: mengutamakan kenyamanan pengguna out-of-the-box, seperti autosuggestion dan syntax highlighting tanpa konfigurasi tambahan. Konsekuensinya, sintaks fish sengaja tidak dibuat kompatibel dengan POSIX, sehingga script Bash umumnya tidak bisa langsung dijalankan di fish tanpa penyesuaian.
1.1.3 Tabel Perbandingan Shell Populer
| Shell | Asal & Tahun | Default di | Kompatibel POSIX | Ciri Khas |
|---|---|---|---|---|
sh | Stephen Bourne, 1979 | Istilah generik, sering symlink ke dash di Debian/Ubuntu | Ya (baseline) | Minimalis, jadi acuan standar POSIX |
bash | Brian Fox (GNU Project), 1989 | Hampir semua distro Linux, WSL | Ya, plus ekstensi GNU | Array, [[ ]], fitur scripting lengkap |
zsh | Paul Falstad, 1990 | macOS (sejak Catalina, 2019) | Ya, plus ekstensi | Kustomisasi tinggi, ekosistem Oh My Zsh |
fish | Axel Liljencrantz, 2005 | Tidak ada secara default, dipasang manual | Tidak | Autosuggestion & syntax highlighting bawaan |
Untuk kebutuhan verifikasi ringan, kita bisa mengecek shell yang sedang aktif dan versi Bash yang terpasang dengan dua perintah berikut.
echo $SHELL
bash --versionPerintah echo $SHELL menampilkan path ke shell login yang tercatat untuk user saat ini, sementara bash --version menampilkan versi Bash yang terpasang di sistem. Series ini berfokus pada Bash karena statusnya sebagai shell paling universal untuk scripting: hampir semua server Linux punya Bash terpasang, dan sebagian besar tutorial serta dokumentasi resmi tool sysadmin ditulis dengan asumsi Bash sebagai shell.
1.2 Kenapa Belajar Bash Scripting Penting
Bash bukan sekadar cara "keren" untuk terlihat jago komputer. Kemampuan menulis script Bash adalah keterampilan praktis yang langsung berdampak pada seberapa banyak pekerjaan berulang yang bisa kita delegasikan ke mesin, entah kita seorang Sysadmin yang mengelola puluhan server, Developer yang butuh alat bantu di sela workflow, atau User biasa yang ingin merapikan folder Downloads tanpa klik satu per satu.
1.2.1 Bash sebagai Fondasi Sistem Linux/Unix
Hampir setiap distribusi Linux, macOS (lewat Homebrew), dan berbagai perangkat embedded berbasis Unix punya Bash tersedia atau bisa dipasang dengan mudah. Banyak tool infrastructure populer, mulai dari script installer, init system, hingga pipeline CI/CD, ditulis dalam bentuk script shell karena sifatnya yang ringan dan tidak butuh proses kompilasi maupun runtime tambahan. Memahami Bash berarti memahami "bahasa ibu" dari sebagian besar sistem berbasis Linux/Unix.
1.2.2 Manfaat Bash untuk Sysadmin
Bagi Sysadmin, Bash adalah alat sehari-hari untuk mengotomatisasi tugas yang kalau dikerjakan manual bisa memakan waktu berjam-jam: backup rutin, monitoring kondisi server, deployment aplikasi, sampai audit keamanan dasar. Satu script Bash yang dijadwalkan lewat cron bisa menggantikan pekerjaan yang seharusnya dilakukan manual tiap hari. Di lapangan, kemampuan ini juga jadi pembeda antara Sysadmin yang harus begadang tiap kali ada insiden dan yang sudah punya sistem alerting otomatis yang mengabari lebih dulu sebelum masalah membesar. Topik ini akan dibahas lebih dalam di Bagian 3.
1.2.3 Manfaat Bash untuk Developer
Developer sering memakai Bash bukan sebagai bahasa utama aplikasi, melainkan sebagai "glue script" yang menyatukan berbagai tool dalam satu alur kerja, misalnya menjalankan test, membangun image Docker, lalu men-deploy hasilnya dalam satu perintah. Sebagian besar pipeline CI/CD seperti GitHub Actions dan GitLab CI juga menjalankan langkah-langkahnya dalam bentuk perintah shell di balik layar, sehingga memahami Bash langsung membantu Developer men-debug pipeline yang gagal.
1.2.4 Manfaat Bash untuk User/Client
Untuk User yang sehari-hari memakai desktop atau laptop Linux/macOS, Bash scripting membuka jalan untuk mengotomatisasi tugas repetitif tanpa perlu memasang aplikasi tambahan: mengganti nama ratusan file foto sekaligus, membuat backup folder penting secara terjadwal, atau membuat alias singkat untuk perintah panjang yang sering dipakai. Topik-topik ini akan menjadi fokus Bagian 2 dari series.
Sebagai gambaran sederhana, satu baris perintah berikut sudah bisa menghitung jumlah file di direktori aktif tanpa membuka file manager sama sekali.
ls -1 | wc -lContoh kecil ini baru permukaan. Semakin jauh kita masuk ke series ini, semakin jelas bahwa Bash scripting adalah investasi keterampilan yang hasilnya terasa hampir setiap hari, baik di depan laptop pribadi maupun saat memegang akses sudo ke server produksi.
1.3 Menyiapkan Lingkungan Kerja Bash
Sebelum menulis satu baris script pun, kita perlu memastikan lingkungan kerja sudah siap. Bagian ini memandu penyiapan terminal dan Bash di tiga platform utama yang dipakai pembaca series ini: Linux, macOS, dan Windows lewat WSL.
1.3.1 Menyiapkan Terminal di Linux
Di Linux, Bash hampir selalu sudah terpasang secara default sebagai bagian dari sistem dasar, jadi umumnya kita tidak perlu memasangnya secara manual. Cara membuka terminal berbeda tergantung desktop environment yang dipakai. Di Ubuntu dengan GNOME, kita bisa memakai pintasan keyboard Ctrl+Alt+T atau mencari "Terminal" lewat menu aplikasi. Di distro berbasis KDE Plasma seperti Kubuntu, terminal bawaannya bernama Konsole. Jika desktop environment yang dipakai tidak menyediakan terminal khusus, xterm biasanya tersedia sebagai pilihan minimal.
Untuk memastikan versi Bash yang terpasang sudah cukup baru, kita bisa mengeceknya lebih dulu sebelum melakukan upgrade jika memang diperlukan.
bash --versionJika versi yang terpasang terlalu lama untuk fitur yang dibahas di series ini (misalnya associative array yang butuh Bash 4 ke atas), lakukan upgrade sesuai package manager distro yang dipakai. Perintahnya berbeda-beda tergantung distro.
# Ubuntu/Debian
sudo apt update && sudo apt install --only-upgrade bash
# Fedora
sudo dnf upgrade bash
# Arch Linux
sudo pacman -Syu bash1.3.2 Menyiapkan Bash di macOS dengan Homebrew
macOS menyediakan Terminal.app secara bawaan, tapi versi Bash yang ikut terpasang di sistem macOS sudah lama tertahan di versi 3.2.57. Apple berhenti memperbarui Bash bawaan macOS sejak versi tersebut karena versi Bash setelahnya beralih ke lisensi GPLv3, yang syarat lisensinya tidak sejalan dengan kebijakan Apple. Karena versi 3.2 tidak mendukung banyak fitur modern seperti associative array, kita sebaiknya memasang Bash versi terbaru lewat package manager Homebrew.
Jika Homebrew belum terpasang, jalankan installer resminya lebih dulu.
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"Setelah Homebrew siap, pasang Bash terbaru dengan perintah berikut.
brew install bashPerlu dicatat, lokasi instalasi Homebrew berbeda tergantung jenis chip Mac yang dipakai: di Mac berbasis Apple Silicon (M1/M2/M3 dan seterusnya), Homebrew terpasang di /opt/homebrew, sementara di Mac berbasis Intel, lokasinya di /usr/local. Bash baru yang terpasang lewat Homebrew tidak otomatis menggantikan Bash bawaan sistem, dan belum otomatis terdaftar sebagai shell yang sah untuk login. Daftarkan dulu ke /etc/shells, baru jadikan sebagai shell default jika diinginkan.
echo "$(brew --prefix)/bin/bash" | sudo tee -a /etc/shells
chsh -s "$(brew --prefix)/bin/bash"Perintah chsh -s mengubah shell login default untuk user yang sedang aktif dan akan meminta password. Efeknya baru terlihat penuh setelah membuka jendela terminal baru.
1.3.3 Menyiapkan WSL di Windows
Bagi pengguna Windows, WSL (Windows Subsystem for Linux) adalah cara paling praktis untuk mendapatkan lingkungan Linux asli lengkap dengan Bash, tanpa perlu dual-boot atau mesin virtual terpisah. Untuk memasangnya, buka PowerShell atau Command Prompt sebagai Administrator, lalu jalankan satu perintah berikut.
wsl --installPerintah ini membutuhkan Windows 10 versi 2004 (build 19041) ke atas, atau Windows 11. Secara default, perintah ini memasang WSL 2 beserta distro Ubuntu. Setelah proses selesai dan komputer di-restart jika diminta, Ubuntu akan terbuka otomatis dan meminta kita membuat username serta password untuk lingkungan Linux tersebut, yang terpisah dari akun Windows.
1.3.4 Verifikasi Instalasi dan Troubleshooting
Di ketiga platform, langkah verifikasi dasarnya sama: pastikan Bash bisa dipanggil dan versinya sesuai kebutuhan.
bash --version
echo $SHELLJika perintah bash --version di macOS masih menampilkan versi 3.2 setelah instalasi lewat Homebrew, kemungkinan besar terminal masih memakai Bash bawaan sistem karena sesi belum di-restart atau shell login belum diubah. Buka jendela terminal baru, atau jalankan langsung path lengkapnya untuk memastikan.
/opt/homebrew/bin/bash --versionDi WSL, jika perintah wsl --install gagal dengan pesan fitur tidak didukung, periksa dulu versi Windows yang terpasang lewat menu "Winver", dan pastikan fitur "Virtual Machine Platform" beserta "Windows Subsystem for Linux" sudah aktif di "Turn Windows features on or off".
1.4 Mengenal Shebang dan Cara Menjalankan Script
Setelah lingkungan siap, saatnya menulis dan menjalankan script Bash pertama kita. Bagian ini membahas dua hal yang wajib dipahami sebelum lanjut ke bab-bab berikutnya: baris shebang di awal script, dan cara memberi izin eksekusi supaya script bisa dijalankan langsung.
1.4.1 Apa itu Shebang?
Shebang adalah dua karakter #! yang diikuti path ke program interpreter, dituliskan sebagai baris paling pertama dalam sebuah file script, contohnya #!/bin/bash. Ketika sebuah file dijalankan sebagai program, kernel membaca baris ini untuk menentukan interpreter mana yang harus dipakai untuk mengeksekusi isi file tersebut. Tanpa shebang, sistem akan mencoba menjalankan file sesuai shell yang sedang aktif saat itu, yang bisa berbeda-beda tergantung siapa yang menjalankannya dan berpotensi menyebabkan script berjalan tidak sesuai harapan karena perbedaan fitur antar-shell.
Shebang harus berada tepat di baris pertama file, tanpa ada baris kosong atau spasi sebelumnya. Ada dua gaya penulisan yang umum dipakai:
#!/bin/bash#!/usr/bin/env bashBentuk pertama menunjuk langsung ke path absolut Bash di sistem. Bentuk kedua memanfaatkan perintah env untuk mencari Bash lewat environment variable $PATH, sehingga lebih portabel di sistem yang lokasi Bash-nya berbeda dari /bin/bash, misalnya di macOS yang memakai Bash versi baru dari Homebrew di /opt/homebrew/bin/bash seperti dibahas di subbab 1.3.2. Di lapangan, bentuk #!/usr/bin/env bash lebih sering direkomendasikan untuk script yang perlu dijalankan di banyak platform berbeda, sementara #!/bin/bash lebih aman dipakai kalau kita sudah tahu persis lokasi Bash di lingkungan target, misalnya di server yang kita kelola sendiri.
1.4.2 Menulis Script Bash Pertama
Buat file baru bernama hello.sh memakai text editor pilihan, lalu isi dengan tiga baris berikut.
#!/bin/bash
# Script sederhana pertama kita
echo "Halo, dunia scripting Bash!"Baris kedua yang diawali tanda pagar (#) adalah komentar, sehingga Bash mengabaikannya saat eksekusi. Baris pertama jadi pengecualian, karena kombinasi #! di posisi paling awal file punya arti khusus sebagai shebang, bukan sekadar komentar biasa.
1.4.3 Memberi Izin Eksekusi dengan chmod +x
Membuat file berisi perintah saja belum cukup. Secara default, file baru yang kita buat biasanya belum memiliki izin eksekusi (execute permission), sehingga sistem operasi menolak menjalankannya sebagai program. Kita bisa memeriksa izin file saat ini dengan ls -l.
ls -l hello.shKeluaran seperti -rw-r--r-- menunjukkan file hanya punya izin baca dan tulis, belum ada izin eksekusi (ditandai huruf x) untuk siapa pun. Tambahkan izin eksekusi dengan perintah chmod.
chmod +x hello.shSetelah perintah ini dijalankan, ls -l hello.sh akan menampilkan izin baru seperti -rwxr-xr-x, dengan huruf x muncul di beberapa posisi menandakan file kini bisa dieksekusi.
1.4.4 Dua Cara Menjalankan Script
Setelah punya izin eksekusi, script bisa dijalankan dengan menuliskan path-nya secara eksplisit, memakai awalan ./ untuk menunjukkan file tersebut ada di direktori aktif.
./hello.shAwalan ./ ini wajib dituliskan karena, demi alasan keamanan, direktori aktif (.) biasanya tidak termasuk dalam $PATH secara default. Jika kita hanya mengetik hello.sh tanpa ./, shell akan mencari file bernama itu di seluruh direktori yang terdaftar di $PATH dan biasanya berujung pada pesan command not found.
Ada cara alternatif menjalankan script tanpa perlu mengubah izin file lebih dulu, yaitu dengan memanggil interpreter secara langsung dan menyertakan nama file script sebagai argumen.
bash hello.shCara ini membuat Bash membaca isi hello.sh sebagai daftar perintah tanpa mempedulikan baris shebang maupun izin eksekusi file, karena interpreter-nya sudah ditentukan lewat perintah bash itu sendiri, bukan lewat mekanisme shebang. Perbedaan ini berguna dipahami saat men-debug script yang gagal jalan lewat ./script.sh tapi berhasil lewat bash script.sh, biasanya tandanya ada masalah di izin file atau baris shebang.
1.4.5 Troubleshooting Error Umum
Kesalahan paling umum saat baru belajar menjalankan script adalah pesan Permission denied ketika mencoba ./hello.sh tanpa memberi izin eksekusi lebih dulu. Solusinya sudah dibahas di subbab 1.4.3, cukup jalankan chmod +x pada file tersebut.
Pitfall lain yang cukup sering ditemui, terutama saat script ditulis di editor berbasis Windows lalu dipindahkan ke Linux atau WSL, adalah error bad interpreter: No such file or directory meski shebang sudah ditulis benar. Penyebabnya biasanya karena file memakai akhiran baris gaya Windows (CRLF, karakter \r\n) alih-alih gaya Unix (LF, hanya \n), sehingga baris shebang terbaca sebagai #!/bin/bash\r dan sistem gagal menemukan interpreter dengan nama seperti itu. Cara mengeceknya bisa memakai cat -A, yang akan menampilkan karakter ^M di akhir tiap baris jika file memang memakai CRLF.
cat -A hello.shJika ditemukan ^M, perbaiki dengan tool dos2unix jika tersedia, atau memakai sed untuk menghapus karakter \r di akhir tiap baris.
sed -i 's/\r$//' hello.shSatu catatan keamanan yang perlu diingat sejak awal: memberi izin eksekusi dan menjalankan script sama artinya dengan memberi izin pada isi script tersebut untuk melakukan apa pun yang bisa dilakukan user yang menjalankannya. Jangan pernah menjalankan script dari sumber yang tidak tepercaya tanpa membaca isinya lebih dulu, karena attacker bisa saja menyisipkan perintah berbahaya di dalamnya. Kebiasaan membaca isi script sebelum menjalankannya adalah salah satu praktik keamanan paling dasar yang akan terus relevan sepanjang series ini, terutama saat masuk ke Bab 23 tentang keamanan Bash.

