Shell adalah program yang kita hadapi untuk memasukkan perintah di sebuah sistem operasi (atau kalau mau definisi lebih lengkap lagi silakan lihat Wikipedia). Di Linux, macOS, Solaris 11, dan beberapa OS lain shell defaultnya adalah bash. Sebagian orang menganggap ini bukan shell terbaik dan masih ada yang lebih fleksibel misalnya zsh atau fish.
Walau pernah mencoba-coba berbagai shell, saya tetap memakai Bash karena ini cukup standar dan tersedia di semua platform dan saya sering bekerja di server yang diatur beberapa orang, jadi memakai sesuatu yang standar merupakan cara terbaik. Setelah puluhan tahun memakai bash, saya juga jadi tahu berbagai trik dan batasan Bash, jadi itu alasan lain saya malas pindah. Sekali lagi: di tulisan ini saya tidak ingin membandingkan berbagai shell, hanya sekedar berbagi tips bash saja.
Sebisa mungkin saya memakai konfigurasi standar, dan hanya di komputer utama (desktop/laptop) saya semakai konfigurasi ekstra. Konfigurasi ekstra yang saya pakai hanya yang tujuannya memudahkan, dan tanpa konfigurasi tersebut juga saya tetap bisa bekerja normal. Saya tidak suka konfigurasi yang menurut saya berbahaya seperti misalnya membuat alias supaya rm
menjadi rm -i
(membuat perintah rm/remove selalu meminta konfirmasi). Hal itu menurut saya berbahaya karena jika konfigurasi tersebut tidak ada di server yang saya ssh, dan saya berharap ada konfirmasi ketika menghapus file (tapi ternyata tidak ada konfirmasi) maka akibatnya bisa fatal.
Library readline
Library readline adalah library input teks untuk program command line. Library ini dipakai di banyak program GNU, termasuk juga bash. Secara default bash memakai library readline ini dengan setting keybinding Emacs. Artinya berbagai shortcut Emacs seperti Control-A (ke awal baris), Control-E (ke akhir baris), Control-K (cut ke clipboard), Control-Y (yank, alias paste), dsb berlaku di prompt bash. Jika kita mau, setting ini bisa diganti menjadi binding Vi dengan set -o vi.
Sebagai pengguna Emacs, saya memakai keybinding default. Salah satu shortcut paling berguna adalah Control-r (reverse search). Daripada mencari-cari perintah yang sebelumnya dengan tombol panah atas, kita bisa menekan control-r, lalu mengetik beberapa huruf substring perintah sebelumnya. Misalnya mencari curl, tekan saja control-r, lalu “curl” (atau cukup “cu” jika tidak ada perintah lain dengan substring sama), lalu tekan control-r lagi jika ingin perintah sebelumnya yang mengandung “curl”.
Kemampuan cut-paste juga berguna, misalnya setelah mengetik perintah panjang (dan belum menekan enter) ternyata sadar ada di direktori yang salah. Tekan control-A (ke awal baris), control-K (cut), pindah direktori dengan cd, lalu control-Y (paste).Sebagai catatan: beberapa program lain juga memiliki fitur seperti readline (misalnya bisa tekan panah atas/bawah) tapi memakai libedit karena readline ini lisensinya GPL.
Konfigurasi
History bash sangat berguna untuk mengingat berbagai perintah yang sudah lalu. Tapi ukuran history defaultnya terlalu kecil buat saya, jadi di komputer utama, saya tambahkan di .bashrc seperti ini:
HISTSIZE=10000 HISTFILESIZE=120000
Jika kita membuka banyak terminal, history terakhir yang akan terekam. Ini menyebalkan, misalnya di terminal pertama kita mengetik perintah A, lalu B, lalu di terminal kedua kita melakukan perintah X, Y, Z, lalu kita logout di terminal kedua, lalu logout terminal pertama, maka hanya A, B saja di history. Supaya sifatnya berubah, tambahkan di .bashrc:
shopt -s histappend #append history
History perintah dari console sebelah tidak bisa diakses dari console sekarang. Untuk hal ini saya memakai trik agar history diload ulang. Di bash kita bisa mendefinisikan PROMPT_COMMAND yang akan dieksekusi ketika menampilkan prompt.
export PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND$'\n'}history -a; history -c; history -r"
Dengan trik tersebut, sebelum menampilkan command maka 3 perintah ini akan dijalankan:
history -a # tambahkan ke file history
history -c # hapus history dari memori saat ini
history -r #baca history lagi (karena mungkin sudah diupdate oleh terminal sebelah)
Scripting
Tidak semua server terinstall berbagai utility command line yang saya butuhkan, jadi hal yang penting adalah memakai berbagai built in bash sebagai pengganti jika tidak ada perintah yang saya butuhkan.
Contoh: program seq dapat digunakan untuk menghasilkan urutan, tapi ini tidak selalu tersedia tapi bisa dilakukan dengan bash. Misalnya jika ingin mencetak angka 1-100:
for((i=1;i<=100;i++)); do echo $i; done
Contoh lain: ada program watch di package procps untuk mengulangi dan memonitor perintah, misalnya untuk melihat ukuran file (mungkin filenya sedang dihasilkan oleh program yang masih berjalan):
watch ls -l filename
Jika tidak ada program watch, bash bisa dipakai
while true; do clear; ls -l filename; sleep 2; done
Hal yang sering saya lakukan adalah menjalankan beberapa program dengan input masing-masing dari file. Contohnya jika saya memiliki daftar hostname, dan saya ingin melakukan copy file ke host tersebut (asumsi: ssh sudah disetup tanpa password):
cat hostlist.txt| while read x; do scp file.txt $x: ; done
Bash juga memiliki fitur substitusi variabel dengan syntax ${VAR/X/Y} yang akan menggantikan X dengan Y di variabel , ini sangat berguna misalnya untuk rename file (mv $i ${i/.abc/.def}), atau untuk command line yang butuh nama file output, misalnya untuk mengkonversi semua file png jadi jpg di sebuah direktori (dengan ImageMagick):
for i in *.jpg; do convert "$i" "${/.jpg/.png}"; done
Sisanya adalah program tambahan
Saya tidak memakai semua fitur bash, misalnya coproc (untuk coprocess), dan jika yang saya lakukan sudah cukup rumit, biasanya saya akan membuat skrip dalam Python.
Sebagai catatan: berbagai perintah seperti cat, awk, sed, dsb bukanlah perintah bash, tapi merupakan program eksternal. Jadi meskipun berguna, saya tidak akan membahasnya kali ini.