GNU/Linux >> Belajar Linux >  >> Linux

Kejutan? Tidak, ShellCheck! Temukan bug di skrip Anda.

Menulis naskah yang baik itu sulit. Ada keterampilan PEBKAC yang jelas, tentu saja, tetapi juga sihir dan sejarah kuno, dengan konvensi warisan ke Plan 9 dan FLOW-MATIC, yang kebanyakan orang tidak benar-benar mengerti atau pedulikan saat menulis perangkat lunak mereka. Kemudian, kurangnya kejahatan &hukuman Dostoevskian dalam pengembangan perangkat lunak juga berarti kode dapat menjadi malas dan menulis sesuka mereka.

Beberapa bulan yang lalu, saya telah menemukan program kecil yang rapi yang dirancang untuk membuat skrip shell Anda lebih sedikit. Ini disebut ShellCheck, tersedia sebagai konsol online, dan Anda juga dapat menginstalnya di hampir semua distro dan kemudian mengintegrasikannya ke dalam alur kerja Anda atau yang lainnya. Penasaran, saya melakukan penjelajahan.

Api di dalam lubang

Saya mulai dengan skrip shell saya sendiri - simWANsim, sebuah program yang dirancang untuk mensimulasikan latensi jaringan WAN dengan cara yang mudah dan nyaman (tidak perlu banyak antarmuka, media langsung atau semacamnya). Ini adalah skrip BASH pada dasarnya, dan saya ingin melihat seberapa efisien dan elegannya. BTW, skrip tidak perlu dieksekusi untuk dievaluasi.

shellcheck "nama skrip"

Saya terkejut dengan jumlah kesalahan dan peringatan, tetapi kemudian, ketika saya mulai membaca, banyak dari ini sebenarnya adalah beberapa contoh dari jenis praktik pengkodean yang buruk yang sama, diulang beberapa kali melalui skrip. Selain itu, saya menyadari bahwa kesalahan itu masuk akal, ditulis dengan jelas, dan itu bukan hanya omong kosong acak. Saran praktis dan berguna - dengan contoh - tentang cara memperbaiki skrip Anda.

Salah satu kesalahan umum adalah penggunaan backticks daripada notasi $(). Saya juga memiliki beberapa baris lain dalam nada yang sama, penggunaan let expr, kurangnya tanda kutip ganda untuk mencegah globbing dan pemisahan kata, dan beberapa masalah kecil lainnya seperti itu.

Dalam simWANsim.sh baris 152:
EGREP=`which egrep`
^-----------^ SC2006:Gunakan notasi $(...) alih-alih legacy backticked `. ..`.
^---^ SC2230:yang tidak standar. Gunakan 'command -v' bawaan sebagai gantinya.

Apakah yang Anda maksud:
EGREP=$(yang egrep)

Dalam simWANsim.sh baris 304:
let PRNT=$PRNT+1
^--------------^ SC2219:Daripada 'let expr', lebih suka (( expr )) .

Saya terkesan dengan studi kasus [sic]. Hai hai. Saya telah menggunakan opsi yang belum benar-benar saya tangani, dan saya juga tidak memiliki kasus umum untuk flag yang tidak ditentukan. Sepertinya saran kecil yang cerdas. Paling licik.

Dalam simWANsim.sh baris 178:
case $flag in
^-- SC2213:getopts ditentukan -a, tetapi tidak ditangani oleh 'kasus' ini.
^-- SC2213:getopts ditentukan -s, tetapi tidak ditangani oleh 'kasus' ini.
^-- SC2220:Bendera yang tidak valid tidak ditangani. Tambahkan kasus *).

Tak satu pun dari ini adalah kardinal, tapi mengapa tidak. Lagi pula, jika Anda dapat membuat kode Anda sebersih dan seanggun mungkin, Anda menghilangkan kemungkinan kesalahan kasus sudut dan perilaku aneh. Saya tidak suka menulis kode, tetapi jika Anda melakukannya, sebaiknya Anda melakukannya dengan benar.

Saya juga menguji skrip yang sangat umum untuk melihat apa yang terjadi ketika tidak ada kesalahan. Alat baris perintah baru saja keluar, tanpa keluaran apa pun. Jika Anda menggunakan alat online, Anda akan mendapatkan pesan tercetak yang berbunyi:

$ shellcheck myscript
Tidak ada masalah yang terdeteksi!

Terakhir, Anda dapat mempercantik output Anda, mengubah verbositas output, gaya format dan warna, memaksa ShellCheck untuk bekerja dengan dialek shell tertentu (termasuk sh, bash, dash, dan ksh), menampilkan tautan wiki, yang dapat berguna bagi mereka yang mencari untuk informasi dan sumber tambahan tentang praktik dan kesalahan pengkodean mereka, ditambah beberapa opsi lainnya. Secara keseluruhan, ini sederhana, efektif, dan elegan.

Kesimpulan

ShellCheck adalah utilitas yang sangat keren. Saya biasanya tidak terlalu peduli dengan hal-hal semacam ini, tetapi saya dapat menghargai keindahan ketika ada beberapa yang dapat ditemukan. Alat itu sendiri telah ditulis dalam Haskell, yang menempatkan kita semua dalam bidang metafisik yang sama sekali berbeda, tetapi kami tidak akan menentangnya.

Jika Anda kebetulan menggunakan skrip shell di lingkungan Anda, Anda mungkin ingin mempertimbangkan untuk mencoba ShellCheck. Saya pikir Anda akan terkejut, karena seharusnya ada banyak kesalahan warisan kecil dalam kode Anda, karena orang jarang kembali dan memperbaiki hal-hal lama, dan Anda berakhir dengan sisa makanan yang tidak lagi masuk akal atau memiliki tujuan apa pun. Di zaman kembung yang tidak perlu, bersikap hemat dan elegan itu penting. Ini adalah cara cerdas untuk memulai diet cangkang Anda. Dan dengan demikian mengakhiri artikel lain.


Linux
  1. Menambahkan argumen dan opsi ke skrip Bash Anda

  2. Izinkan Setuid Pada Skrip Shell?

  3. Menyembunyikan Kata Sandi Dalam Skrip Shell?

  1. Cara menggunakan input dalam skrip shell Anda

  2. Waktu Habis Dalam Skrip Shell?

  3. Cara menjalankan skrip Python dari shell

  1. Array Asosiatif Dalam Skrip Shell?

  2. Penguncian yang Benar Dalam Skrip Shell?

  3. Simpan Hasil Cari Sebagai Variabel Dalam Script Shell?