Cara men -debug skrip pesta

Cara men -debug skrip pesta

Ada teknik dari lingkungan pemrograman tradisional yang dapat membantu.
Beberapa alat dasar seperti menggunakan editor dengan penyorotan sintaks akan membantu juga.
Ada opsi bawaan yang disediakan Bash untuk membuat debugging dan pekerjaan administrasi sistem Linux sehari -hari Anda lebih mudah.

Dalam artikel ini Anda akan mempelajari beberapa metode yang berguna untuk men -debug skrip bash:

  • Cara menggunakan teknik traditonal
  • Cara menggunakan opsi xtrace
  • Cara menggunakan opsi bash lainnya
  • Cara menggunakan jebakan

Alat debugging yang paling efektif masih dipikirkan dengan cermat, ditambah dengan pernyataan cetak yang ditempatkan dengan bijak. - Brian Kernighan, "Unix for Beginners" (1979)

Persyaratan dan konvensi perangkat lunak yang digunakan

Persyaratan Perangkat Lunak dan Konvensi Baris Perintah Linux
Kategori Persyaratan, konvensi atau versi perangkat lunak yang digunakan
Sistem Distribusi GNU/Linux apa pun
Perangkat lunak Bash GNU
Lainnya N/a
Konvensi # - mensyaratkan perintah linux yang diberikan untuk dieksekusi dengan hak istimewa root baik secara langsung sebagai pengguna root atau dengan menggunakan sudo memerintah
$ - mensyaratkan perintah Linux yang diberikan untuk dieksekusi sebagai pengguna biasa

Menggunakan teknik tradisional

Kode debugging bisa rumit, bahkan jika kesalahannya sederhana dan jelas. Programmer secara tradisional memanfaatkan alat -alat seperti debuggers dan sintaksis sintaksis di editor untuk membantu mereka. Tidak ada bedanya saat menulis skrip bash. Cukup memiliki penyorotan sintaks akan memungkinkan Anda untuk menangkap kesalahan saat Anda menulis kode, menghemat tugas yang memakan waktu untuk melacak kesalahan nanti.

Some programming languages ​​come with companion debugging environments, like gcc and gdb that let you step through code, set breakpoints, examine the state of everything at those points in the execution and more - but there's generally less need for a heavy handed approach like that with skrip shell karena kode hanya ditafsirkan alih -alih dikompilasi ke dalam binari.

Ada teknik yang digunakan dalam lingkungan pemrograman tradisional yang dapat berguna dengan skrip bash yang kompleks, seperti menggunakan pernyataan. Ini pada dasarnya adalah cara untuk secara eksplisit menegaskan kondisi atau keadaan pada suatu saat. Pernyataan dapat menentukan bahkan yang paling halus dari bug. Mereka dapat diimplementasikan sebagai fungsi pendek yang menunjukkan waktu, nomor baris dan semacamnya, atau sesuatu seperti ini:

$ echo "function_name (): nilai \\ $ var adalah $ var"

Cara menggunakan opsi bash xtrace

Saat menulis skrip shell, logika pemrograman cenderung lebih pendek dan sering terkandung dalam satu file. Jadi ada beberapa opsi debugging bawaan yang dapat kita gunakan untuk melihat apa yang salah. Opsi pertama untuk disebutkan mungkin juga yang paling berguna - xtrace pilihan. Ini dapat diterapkan pada skrip dengan memohon bash dengan -X mengalihkan.

$ bash -x 


Ini memberitahu Bash untuk menunjukkan kepada kita seperti apa setiap pernyataan setelah evaluasi, tepat sebelum dieksekusi. Kita akan segera melihat contoh ini beraksi, tapi pertama -tama mari kita kontras -X dengan kebalikannya -v, yang menunjukkan setiap baris sebelum dievaluasi bukan setelahnya. Opsi dapat digabungkan dan dengan menggunakan keduanya -X Dan -v Anda dapat melihat seperti apa pernyataan itu sebelum dan sesudah substitusi variabel terjadi.

Pengaturan X Dan v Opsi di baris perintah

Perhatikan bagaimana menggunakan -X Dan -v Opsi bersama memungkinkan kita untuk melihat pernyataan IF asli sebelum $ Pengguna variabel diperluas, berkat -v pilihan. Kami juga melihat pada garis yang dimulai dengan tanda plus seperti apa pernyataan itu lagi setelah substitusi, yang menunjukkan kepada kami nilai -nilai aktual dibandingkan di dalam jika penyataan. Dalam contoh yang lebih rumit ini bisa sangat berguna.

Cara menggunakan opsi bash lainnya

Opsi bash untuk debugging dimatikan secara default, tetapi begitu mereka dihidupkan dengan menggunakan perintah set, mereka tetap hidup sampai secara eksplisit dimatikan. Jika Anda tidak yakin opsi mana yang diaktifkan, Anda dapat memeriksa $- variabel untuk melihat keadaan saat ini dari semua variabel.

$ echo $- himbhs $ set -xv && echo $- himvxbhs 

Ada sakelar berguna lain yang dapat kami gunakan untuk membantu kami menemukan variabel yang dirujuk tanpa memiliki set nilai apapun. Ini adalah -u beralih, dan sama seperti -X Dan -v Ini juga dapat digunakan pada baris perintah, seperti yang kita lihat dalam contoh berikut:

Pengaturan u Opsi di baris perintah

Kami secara keliru menetapkan nilai 7 ke variabel yang disebut "level" kemudian mencoba untuk menggemakan variabel bernama "skor" yang hanya menghasilkan pencetakan sama sekali ke layar. Sama sekali tidak ada informasi debug yang diberikan. Mengatur kami -u Switch memungkinkan kami untuk melihat pesan kesalahan tertentu, “skor: variabel tidak terikat” yang menunjukkan dengan tepat apa yang salah.

Kami dapat menggunakan opsi -opsi tersebut dalam skrip bash pendek untuk memberi kami informasi debug untuk mengidentifikasi masalah yang tidak memicu umpan balik dari juru bahasa bash. Mari kita berjalan melalui beberapa contoh.

#!/bin/bash baca -p "path yang akan ditambahkan:" $ path if ["$ path" = "/home/mike/bin"]; Kemudian echo $ path >> $ path echo "Path baru: $ path" else echo "tidak memodifikasi path" fi 
Menyalin Menggunakan X opsi saat menjalankan skrip bash Anda

Dalam contoh di atas kita menjalankan skrip addpath secara normal dan itu tidak memodifikasi kita JALUR. Itu tidak memberi kita indikasi mengapa atau petunjuk untuk kesalahan yang dibuat. Menjalankannya lagi menggunakan -X Opsi dengan jelas menunjukkan kepada kita bahwa sisi kiri perbandingan kami adalah string kosong. $ path adalah string kosong karena kami secara tidak sengaja meletakkan tanda dolar di depan "jalur" dalam pernyataan baca kami. Terkadang kita melihat kesalahan seperti ini dan itu tidak terlihat salah sampai kita mendapatkan petunjuk dan berpikir, “Mengapa $ path dievaluasi ke string kosong?"

Mencari contoh berikutnya, kami juga tidak mendapatkan indikasi kesalahan dari penerjemah. Kami hanya mendapatkan satu nilai dicetak per baris, bukan dua. Ini bukan kesalahan yang akan menghentikan eksekusi skrip, jadi kita dibiarkan begitu saja tanpa diberi petunjuk. Menggunakan -u beralih, kami segera mendapatkan pemberitahuan bahwa variabel kami J tidak terikat pada nilai. Jadi ini adalah penabung waktu nyata ketika kita membuat kesalahan yang tidak mengakibatkan kesalahan aktual dari sudut pandang Bash Interpreter.

#!/bin/bash for i in 1 2 3 do echo $ i $ j selesai 
Menyalin Menggunakan u opsi menjalankan skrip Anda dari baris perintah

Sekarang pasti Anda berpikir itu kedengarannya bagus, tetapi kami jarang membutuhkan bantuan untuk men-debug kesalahan yang dilakukan pada satu kalimat di baris perintah atau dalam skrip pendek seperti ini. Kami biasanya berjuang dengan debugging ketika kami berurusan dengan skrip yang lebih lama dan lebih rumit, dan kami jarang perlu mengatur opsi ini dan membiarkannya diatur saat kami menjalankan beberapa skrip. Pengaturan -xv opsi dan kemudian menjalankan skrip yang lebih kompleks akan sering menambah kebingungan dengan menggandakan atau tiga kali lipat jumlah output yang dihasilkan.

Untungnya kita dapat menggunakan opsi ini dengan cara yang lebih tepat dengan menempatkannya di dalam skrip kita. Alih -alih secara eksplisit meminta shell bash dengan opsi dari baris perintah, kami dapat mengatur opsi dengan menambahkannya ke garis shebang sebagai gantinya.

#!/bin/bash -x

Ini akan mengatur -X Opsi untuk seluruh file atau sampai tidak disetel selama eksekusi skrip, memungkinkan Anda untuk hanya menjalankan skrip dengan mengetik nama file alih -alih meneruskannya ke bash sebagai parameter. Skrip panjang atau yang memiliki banyak output masih akan menjadi sulit menggunakan teknik ini, jadi mari kita lihat cara yang lebih spesifik untuk menggunakan opsi.



Untuk pendekatan yang lebih bertarget, kelilingi hanya blok kode yang mencurigakan dengan opsi yang Anda inginkan. Pendekatan ini sangat bagus untuk skrip yang menghasilkan menu atau output terperinci, dan dicapai dengan menggunakan kata kunci set dengan plus atau minus sekali lagi.

#!/bin/bash baca -p "path yang akan ditambahkan:" $ path set -xv if ["$ path" = "/home/mike/bin"]; Kemudian echo $ path >> $ path echo "Path baru: $ path" else echo "tidak memodifikasi path" fi set +xv 
Menyalin Opsi pembungkus di sekitar blok kode dalam skrip Anda

Kami hanya mengelilingi blok kode yang kami curigai untuk mengurangi output, membuat tugas kami lebih mudah dalam proses. Perhatikan kami menyalakan opsi kami hanya untuk blok kode yang berisi pernyataan if-then-else kami, lalu matikan opsi di akhir blok tersangka. Kita dapat menyalakan dan mematikan opsi ini beberapa kali dalam satu skrip jika kita tidak dapat mempersempit area yang mencurigakan, atau jika kita ingin mengevaluasi keadaan variabel di berbagai titik saat kita maju melalui skrip. Tidak perlu mematikan opsi jika kita ingin melanjutkan untuk sisa eksekusi skrip.

Demi kelengkapan kita juga harus menyebutkan bahwa ada debugger yang ditulis oleh pihak ketiga yang akan memungkinkan kita untuk melangkah melalui kode eksekusi baris demi baris. Anda mungkin ingin menyelidiki alat -alat ini, tetapi kebanyakan orang menemukan bahwa mereka sebenarnya tidak diperlukan.

Seperti yang akan disarankan oleh programmer berpengalaman, jika kode Anda terlalu rumit untuk mengisolasi blok mencurigakan dengan opsi ini maka masalah sebenarnya adalah bahwa kode harus diperbaiki. Kode yang terlalu kompleks berarti bug bisa sulit dideteksi dan pemeliharaan bisa memakan waktu dan mahal.

Satu hal terakhir yang disebutkan tentang opsi debugging bash adalah bahwa opsi file globbing juga ada dan diatur dengan -F. Mengatur opsi ini akan mematikan Globbing (perluasan wildcard untuk menghasilkan nama file) saat diaktifkan. Ini -F Opsi dapat berupa sakelar yang digunakan pada baris perintah dengan bash, setelah shebang dalam file atau, seperti dalam contoh ini untuk mengelilingi blok kode.

#!/bin/bash echo "Abaikan opsi FileGlobbing dimatikan" ls * echo "Abaikan opsi file globbing set" set -f ls * set +f 
Menyalin Menggunakan F Opsi untuk mematikan file Globbing

Cara menggunakan perangkap untuk membantu debug

Ada lebih banyak teknik yang terlibat yang layak dipertimbangkan jika skrip Anda rumit, termasuk menggunakan fungsi menegaskan seperti yang disebutkan sebelumnya. Salah satu metode yang perlu diingat adalah penggunaan jebakan. Skrip shell memungkinkan kita untuk menjebak sinyal dan melakukan sesuatu pada saat itu.

Contoh sederhana namun berguna yang dapat Anda gunakan dalam skrip bash Anda adalah menjebak KELUAR.

#!/BIN/BASH TRAP 'ECHO SCORE IS $ SCORE, Status IS $ Status' Exit If [-Z $ 1]; kemudian status = "default" lain status = $ 1 skor fi = 0 if [$ user = 'superman']; kemudian skor = 99 elif [$# -gt 1]; Kemudian skor = $ 2 fi 
Menyalin Menggunakan perangkap KELUAR untuk membantu men -debug skrip Anda

Seperti yang Anda lihat hanya membuang nilai variabel saat ini ke layar dapat berguna untuk menunjukkan di mana logika Anda gagal. Itu KELUAR sinyal jelas tidak membutuhkan eksplisit KELUAR pernyataan yang akan dihasilkan; dalam hal ini gema Pernyataan dieksekusi saat akhir skrip tercapai.

Perangkap lain yang berguna untuk digunakan dengan skrip bash adalah Debug. Ini terjadi setelah setiap pernyataan, sehingga dapat digunakan sebagai cara brute force untuk menunjukkan nilai -nilai variabel pada setiap langkah dalam eksekusi skrip.

#!/bin/bash trap 'echo "baris $ lineno: skor adalah $ skor"' Debug skor = 0 if ["$ user" = "mike"]; Kemudian biarkan "skor += 1" fi let "skor += 1" jika ["$ 1" = "7"]; Kemudian skor = 7 FI EXIT 0 
Menyalin Menggunakan perangkap Debug untuk membantu men -debug skrip Anda

Kesimpulan

Saat Anda melihat skrip bash Anda tidak berperilaku seperti yang diharapkan dan alasannya tidak jelas bagi Anda karena alasan apa pun, pertimbangkan informasi apa yang akan berguna untuk membantu Anda mengidentifikasi penyebabnya kemudian menggunakan alat yang paling nyaman yang tersedia untuk membantu Anda menentukan masalah ini. Opsi XTrace -X mudah digunakan dan mungkin yang paling berguna dari opsi yang disajikan di sini, jadi pertimbangkan untuk mencobanya lain kali Anda dihadapkan dengan skrip yang tidak melakukan apa yang Anda pikir akan.

Tutorial Linux Terkait:

  • Cara menyebarkan sinyal untuk proses anak dari pesta ..
  • Menguasai loop skrip bash
  • Bagaimana melakukan operasi administrasi dengan ansible…
  • Loop bersarang dalam skrip bash
  • Cara menggunakan subshells bash di dalamnya jika pernyataan
  • Pengantar Otomatisasi Linux, Alat dan Teknik
  • Hal -hal yang harus diinstal pada ubuntu 20.04
  • Cara menggunakan ADB Android Debug Bridge untuk mengelola Android Anda…
  • Bash If Pernyataan: Jika, elif, lain, lalu, fi
  • Optimalisasi Kinerja Linux: Alat dan Teknik