Cara debug skrip bash

Cara debug skrip bash

Terdapat teknik dari persekitaran pengaturcaraan tradisional yang dapat membantu.
Beberapa alat asas seperti menggunakan editor dengan penonjolan sintaks akan membantu juga.
Terdapat pilihan terbina yang disediakan oleh Bash untuk membuat debugging dan pekerjaan pentadbiran sistem linux setiap hari anda lebih mudah.

Dalam artikel ini, anda akan mempelajari beberapa kaedah berguna untuk menyahpepijat skrip bash:

  • Cara Menggunakan Teknik Traditonal
  • Cara menggunakan pilihan xtrace
  • Cara Menggunakan Pilihan Bash Lain
  • Cara menggunakan perangkap

Alat penyahpepijatan yang paling berkesan masih difikirkan dengan teliti, ditambah dengan pernyataan cetak yang diletakkan dengan bijak. - Brian Kernighan, "Unix for Beginners" (1979)

Keperluan perisian dan konvensyen yang digunakan

Keperluan Perisian dan Konvensyen Talian Perintah Linux
Kategori Keperluan, konvensyen atau versi perisian yang digunakan
Sistem Sebarang pengedaran GNU/Linux
Perisian Gnu Bash
Yang lain N/a
Konvensyen # - Memerlukan arahan Linux yang diberikan untuk dilaksanakan dengan keistimewaan akar sama ada secara langsung sebagai pengguna root atau dengan menggunakan sudo perintah
$ - Memerlukan arahan Linux yang diberikan sebagai pengguna yang tidak layak

Menggunakan teknik tradisional

Kod debugging boleh menjadi rumit, walaupun kesilapannya mudah dan jelas. Pengaturcara secara tradisinya mengambil kesempatan daripada alat seperti debuggers dan sintaks yang menonjolkan editor untuk membantu mereka. Tidak berbeza ketika menulis skrip bash. Hanya mempunyai penonjolan sintaks akan membolehkan anda menangkap kesilapan semasa anda menulis kod, menjimatkan tugas masa yang memakan masa untuk menjejaki kesilapan kemudian.

Sesetengah bahasa pengaturcaraan datang dengan persekitaran debugging teman, seperti GCC dan GDB yang membolehkan anda melangkah melalui kod, menetapkan titik putus, memeriksa keadaan segala -galanya di titik -titik tersebut dalam pelaksanaan dan banyak lagi - tetapi pada umumnya kurang memerlukan pendekatan yang diserahkan berat seperti itu dengan itu dengan itu dengan itu dengan itu dengan skrip shell kerana kod itu hanya ditafsirkan dan bukannya disusun menjadi binari.

Terdapat teknik yang digunakan dalam persekitaran pengaturcaraan tradisional yang boleh berguna dengan skrip bash kompleks, seperti menggunakan pernyataan. Ini pada dasarnya adalah cara untuk menegaskan keadaan secara eksplisit atau keadaan pada satu masa. Pernyataan dapat menentukan bahkan subtlest bug. Mereka boleh dilaksanakan sebagai fungsi pendek yang menunjukkan masa, nombor talian dan sebagainya, atau sesuatu seperti ini:

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

Cara Menggunakan Pilihan Bash Xtrace

Semasa menulis skrip shell, logik pengaturcaraan cenderung lebih pendek dan sering terkandung dalam satu fail. Oleh itu, terdapat beberapa pilihan penyahpepijatan terbina dalam yang boleh kita gunakan untuk melihat apa yang salah. Pilihan pertama yang dinyatakan mungkin juga yang paling berguna - Xtrace pilihan. Ini boleh digunakan untuk skrip dengan menggunakan bash dengan -x suis.

$ bash -x 


Ini memberitahu Bash untuk menunjukkan kepada kami bagaimana setiap pernyataan seperti selepas penilaian, sebelum ia dilaksanakan. Kita akan melihat contoh ini dalam tindakan tidak lama lagi, tetapi pertama -tama mari kita berbeza -x dengan sebaliknya -v, yang menunjukkan setiap baris sebelum dinilai dan bukannya selepas. Pilihan boleh digabungkan dan dengan menggunakan kedua -duanya -x dan -v anda dapat melihat apa pernyataan seperti sebelum dan selepas penggantian pembolehubah berlaku.

Menetapkan x dan v Pilihan di baris arahan

Perhatikan bagaimana menggunakan -x dan -v Pilihan bersama membolehkan kita melihat pernyataan jika asal sebelum $ Pengguna Pembolehubah diperluas, terima kasih kepada -v pilihan. Kami juga melihat pada baris bermula dengan tanda tambah apa pernyataan itu kelihatan seperti lagi selepas penggantian, yang menunjukkan nilai sebenar kita dibandingkan di dalamnya jika penyata. Dalam contoh yang lebih rumit ini boleh menjadi sangat berguna.

Cara Menggunakan Pilihan Bash Lain

Pilihan bash untuk penyahpepijatan dimatikan secara lalai, tetapi sebaik sahaja mereka dihidupkan dengan menggunakan perintah set, mereka tetap terus dimatikan. Sekiranya anda tidak pasti pilihan mana yang diaktifkan, anda boleh memeriksa $- pemboleh ubah untuk melihat keadaan semasa semua pembolehubah.

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

Terdapat satu lagi suis berguna yang boleh kami gunakan untuk membantu kami mencari pembolehubah yang dirujuk tanpa set nilai. Ini adalah -u beralih, dan seperti -x dan -v Ia juga boleh digunakan pada baris arahan, seperti yang kita lihat dalam contoh berikut:

Menetapkan u pilihan di baris arahan

Kami tersilap memberikan nilai 7 kepada pemboleh ubah yang disebut "tahap" kemudian cuba menggema pembolehubah bernama "skor" yang hanya menghasilkan mencetak apa -apa ke skrin. Sama sekali tidak ada maklumat debug yang diberikan. Menetapkan kami -u suis membolehkan kami melihat mesej ralat tertentu, "Skor: Pembolehubah Tidak Terikat" yang menunjukkan dengan tepat apa yang berlaku.

Kita boleh menggunakan pilihan tersebut dalam skrip bash pendek untuk memberi kita maklumat debug untuk mengenal pasti masalah yang tidak mencetuskan maklum balas daripada jurubahasa bash. Mari berjalan melalui beberapa contoh.

#!/bin/bash baca -p "jalan yang akan ditambah:" $ path jika ["$ path" = "/home/mike/bin"]; kemudian echo $ path >> $ path echo "jalan baru: $ path" else echo "tidak mengubahsuai jalan" fi 
Salinan Menggunakan x pilihan semasa menjalankan skrip bash anda

Dalam contoh di atas, kami menjalankan skrip AddPath secara normal dan ia tidak mengubah suai kami Jalan. Ia tidak memberi kita petunjuk mengapa atau petunjuk kepada kesilapan yang dibuat. Menjalankannya lagi menggunakan -x Pilihan dengan jelas menunjukkan kepada kita bahawa bahagian kiri perbandingan kami adalah rentetan kosong. $ jalan adalah tali kosong kerana kami secara tidak sengaja meletakkan tanda dolar di hadapan "jalan" dalam pernyataan baca kami. Kadang -kadang kita melihat kesilapan seperti ini dan tidak kelihatan salah sehingga kita mendapat petunjuk dan berfikir, "Mengapa $ jalan dinilai dengan tali kosong?"

Melihat contoh seterusnya ini, kami juga tidak mendapat petunjuk kesilapan dari jurubahasa. Kami hanya mendapat satu nilai dicetak setiap baris dan bukannya dua. Ini bukan kesalahan yang akan menghentikan pelaksanaan skrip, jadi kami dibiarkan hanya tertanya -tanya tanpa diberikan petunjuk. Menggunakan -u beralih, kami segera mendapat pemberitahuan bahawa pemboleh ubah kami j tidak terikat dengan nilai. Oleh itu, ini adalah penabung masa nyata apabila kita membuat kesilapan yang tidak mengakibatkan kesilapan sebenar dari sudut pandang penterjemah bash.

#!/bin/bash untuk saya dalam 1 2 3 lakukan echo $ i $ j selesai 
Salinan Menggunakan u pilihan menjalankan skrip anda dari baris arahan

Sekarang anda berfikir bahawa kedengarannya baik-baik saja, tetapi kami jarang memerlukan bantuan debugging kesilapan yang dibuat dalam satu liners di baris arahan atau dalam skrip pendek seperti ini. Kami biasanya berjuang dengan debugging apabila kami berurusan dengan skrip yang lebih lama dan lebih rumit, dan kami jarang perlu menetapkan pilihan ini dan meninggalkannya semasa kami menjalankan pelbagai skrip. Menetapkan -xv pilihan dan kemudian menjalankan skrip yang lebih kompleks akan sering menambah kekeliruan dengan menggandakan atau tiga kali ganda jumlah output yang dihasilkan.

Nasib baik kita boleh menggunakan pilihan ini dengan cara yang lebih tepat dengan meletakkannya di dalam skrip kita. Daripada secara eksplisit menggunakan shell bash dengan pilihan dari baris arahan, kita boleh menetapkan pilihan dengan menambahkannya ke garis shebang sebaliknya.

#!/bin/bash -x

Ini akan menetapkan -x Pilihan untuk keseluruhan fail atau sehingga ia tidak tersembunyi semasa pelaksanaan skrip, membolehkan anda hanya menjalankan skrip dengan menaip nama fail dan bukannya lulus ke bash sebagai parameter. Skrip panjang atau yang mempunyai banyak output masih akan menjadi sukar menggunakan teknik ini, jadi mari kita lihat cara yang lebih spesifik untuk menggunakan pilihan.



Untuk pendekatan yang lebih disasarkan, hanya mengelilingi blok kod yang mencurigakan dengan pilihan yang anda mahukan. Pendekatan ini bagus untuk skrip yang menjana menu atau output terperinci, dan dicapai dengan menggunakan kata kunci set dengan ditambah atau tolak sekali lagi.

#!/bin/bash baca -p "jalur yang akan ditambah:" $ path set -xv if ["$ path" = "/home/mike/bin"]; kemudian echo $ path >> $ path echo "jalan baru: $ path" else echo "tidak mengubah suai jalan" fi set +xv 
Salinan Membungkus pilihan di sekitar blok kod dalam skrip anda

Kami hanya mengelilingi blok kod yang kami rasa untuk mengurangkan output, menjadikan tugas kami lebih mudah dalam proses. Perhatikan kami menghidupkan pilihan kami hanya untuk blok kod yang mengandungi pernyataan IF-THEN-ELSE kami, kemudian matikan pilihan pada akhir blok suspek. Kita boleh menghidupkan dan mematikan pilihan ini dalam skrip tunggal jika kita tidak dapat menyempitkan kawasan yang mencurigakan, atau jika kita ingin menilai keadaan pembolehubah di pelbagai titik ketika kita maju melalui skrip. Tidak perlu mematikan pilihan jika kita mahu ia meneruskan untuk selebihnya pelaksanaan skrip.

Demi kesempurnaan kita harus menyebutkan juga bahawa terdapat debuggers yang ditulis oleh pihak ketiga yang akan membolehkan kita melangkah melalui baris pelaksanaan kod demi baris. Anda mungkin mahu menyiasat alat ini, tetapi kebanyakan orang mendapati bahawa mereka sebenarnya tidak diperlukan.

Seperti yang akan dicadangkan oleh pengaturcara yang berpengalaman, jika kod anda terlalu kompleks untuk mengasingkan blok yang mencurigakan dengan pilihan ini maka masalah sebenar adalah bahawa kod itu harus refactored. Kod yang terlalu kompleks bermaksud pepijat boleh menjadi sukar untuk mengesan dan penyelenggaraan dapat memakan masa dan mahal.

Satu perkara terakhir yang disebutkan mengenai pilihan debugging bash ialah pilihan fail globbing juga wujud dan ditetapkan dengan -f. Menetapkan pilihan ini akan mematikan globbing (pengembangan kad liar untuk menghasilkan nama fail) semasa diaktifkan. Ini -f Pilihan boleh menjadi suis yang digunakan pada baris arahan dengan bash, selepas shebang dalam fail atau, seperti dalam contoh ini untuk mengelilingi blok kod.

#!/bin/bash echo "Abaikan pilihan fileglobbing dimatikan" ls * echo "Abaikan pilihan file globbing set" set -f ls * set +f 
Salinan Menggunakan f Pilihan untuk mematikan fail globbing

Cara menggunakan perangkap untuk membantu debug

Terdapat lebih banyak teknik yang terlibat yang patut dipertimbangkan jika skrip anda rumit, termasuk menggunakan fungsi menegaskan seperti yang disebutkan sebelumnya. Satu kaedah sedemikian yang perlu diingat ialah penggunaan perangkap. Skrip shell membolehkan kami menjebak isyarat dan melakukan sesuatu pada ketika itu.

Contoh yang mudah tetapi berguna yang boleh anda gunakan dalam skrip bash anda adalah untuk menjebak Keluar.

#!/Bin/Bash Trap 'Echo Score adalah skor $, status $ status' keluar jika [-z $ 1]; kemudian status = "lalai" status lain = $ 1 fi skor = 0 jika [$ user = 'superman']; kemudian skor = 99 ELIF [$# -GT 1]; Kemudian skor = $ 2 fi 
Salinan Menggunakan perangkap Keluar Untuk membantu debug skrip anda

Seperti yang anda lihat hanya membuang nilai semasa pembolehubah ke skrin boleh berguna untuk menunjukkan di mana logik anda gagal. The Keluar Isyarat jelas tidak memerlukan eksplisit keluar pernyataan yang akan dijana; dalam kes ini echo pernyataan dilaksanakan apabila akhir skrip dicapai.

Perangkap lain yang berguna untuk digunakan dengan skrip bash adalah Debug. Ini berlaku selepas setiap pernyataan, jadi ia boleh digunakan sebagai cara kekerasan untuk menunjukkan nilai pembolehubah pada setiap langkah dalam pelaksanaan 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 keluar 0 
Salinan Menggunakan perangkap Debug Untuk membantu debug skrip anda

Kesimpulan

Apabila anda melihat skrip bash anda tidak berkelakuan seperti yang diharapkan dan alasannya tidak jelas kepada anda atas sebab apa pun, pertimbangkan maklumat apa yang berguna untuk membantu anda mengenal pasti punca kemudian gunakan alat yang paling selesa untuk membantu anda menentukan masalah ini. Pilihan Xtrace -x mudah digunakan dan mungkin yang paling berguna dari pilihan yang dibentangkan di sini, jadi pertimbangkan untuk mencubanya pada waktu berikutnya anda berhadapan dengan skrip yang tidak melakukan apa yang anda sangka.

Tutorial Linux Berkaitan:

  • Cara menyebarkan isyarat kepada proses kanak -kanak dari bash ..
  • Menguasai Gelung Skrip Bash
  • Cara Melaksanakan Operasi Pentadbiran dengan Ansible ..
  • Gelung bersarang dalam skrip bash
  • Cara Menggunakan Subshells Bash Di dalam Jika Kenyataan
  • Pengenalan kepada Automasi, Alat dan Teknik Linux
  • Perkara yang hendak dipasang di Ubuntu 20.04
  • Cara Menggunakan Adb Android Debug Bridge untuk Mengurus Android Anda ..
  • Bash jika pernyataan: jika, elif, lain, maka, fi
  • Pengoptimuman Prestasi Linux: Alat dan Teknik