Memeriksa Script Bash Menggunakan Shellcheck
Pada masa awal-awal menggunakan Linux dan berhasil menulis bash
script, I felt like a hacker.
Menyadari bahwa bisa menulis beberapa baris untuk mengerjakan tugas tertentu telah membuka cakrawala pikiran saya yang kala itu masih menggunakan Windows. It’s different, simple, but powerfull.
Dari sana, kemudian banyak membaca dan menulis script bash. Ternyata tidak sesederhana yang semula dipikirkan, namun tetap saja menyenangkan.
Dari sumber-sumber bacaan, akhirnya saya mengenal yang namanya good practice dalam programming. Well, there are peoples who laugh at your face for saying bash scripting as programming. Abaikan saja, dan buat bash
script yang sesuai dengan kaidah yang baik.
Jadi, bagaimanakah rupa bash
script yang baik? Sejujurnya saya tidak bisa menilai sebuah apakah sebuah bash
script itu baik atau tidak, semakin banyak yang saya baca mengenai bash
, semakin banyak yang tidak dimengerti.
Untungnya, –maklum, sebagai orang Indonesia kita selalu beruntung– ada alat untuk membantu kita menilai apakah sebuah script bash
itu baik atau tidak. Nama alat tersebut adalah shellcheck
.
shellcheck
adalah piranti lunak untuk menelaah shell script (static analysis tool for shell scripts).
Kita bisa memeriksakan script secara daring di http://www.shellcheck.net atau dengan memasang paket shellcheck
di distro kesayangan.
Berikut dicontohkan sebuah kasus sederhana; Saya memiliki sebuah map berisi clone dari repository di github yang dirasa menarik. Isinya tidak terlalu banyak, namun akan cukup membosankan jika mesti memutakhirkannya secara manual satu-per-satu. Jadi saya membuat sebuah script bernama ghupdate
untuk melakukan git pull
pada tiap repo tersebut. Berikut script-nya:
#!/bin/bash
GITHUB="$HOME/github"
while read repo; do
cd "$repo"
printf "\n Pulling $repo ...\n"
git pull
done < <(find "$GITHUB" -maxdepth 1 -type d)
Sekilas terlihat tidak ada yang aneh dari script ini, dan nyatanya ia pun bekerja dengan baik. Mari kita periksa apa pendapat shellcheck
:
shellcheck ghupdate
Dan hasilnya…
In ghupdate line 5:
while read repo; do
^-- SC2162: read without -r will mangle backslashes.
In ghupdate line 6:
cd "$repo"
^-- SC2164: Use cd ... || exit in case cd fails.
In ghupdate line 7:
printf "\n Pulling $repo ...\n"
^-- SC2059: Don't use variables in the printf format string. Use printf "..%s.." "$foo".
Hmmm, ternyata script ghupdate
ini tidak sebaik yang dikira.
shellcheck
setidaknya menunjukkan tiga kelemahan pada script. Sayangnya, jika menggunakan shellchek
dari repo, kita hanya akan disuguhi hasil secara garis besar. Jika menginginkan rincian mengenai kesalahan dan bagaimana memperbaikinya, mengharuskan kita untuk memeriksanya secara daring di wiki shellcheck
.
Jadi, rincian kelemahan script ghupdate
di atas dapat diperiksa di:
- https://github.com/koalaman/shellcheck/wiki/SC2162
- https://github.com/koalaman/shellcheck/wiki/SC2164
- https://github.com/koalaman/shellcheck/wiki/SC2059
Dan akhirnya, berikut script ghupdate
hasil perbaikan:
#!/bin/bash
GITHUB="$HOME/github"
while IFS="" read -r repo; do
cd "$repo" || exit
printf "\n Pulling %s ...\n" "$repo"
git pull
done < <(find "$GITHUB" -maxdepth 1 -type d)
Happy shellcecking…