Bagaimana cara debug skrip bash?

How Debug Bash Script




Mana-mana program mesti bebas daripada kesilapan sebelum sampai ke pengguna. Pembangun perisian berusaha sebaik mungkin untuk menjadikan program perisian bebas daripada pepijat. Tetapi sukar untuk membuat kod tanpa kesalahan apabila terdapat ribuan baris. Debugging adalah proses yang berterusan; ia membantu dalam segera mengesan kesalahan, mengumpulkan maklumat berharga mengenai kod, dan menghilangkan potongan kod yang berlebihan.

Semua bahasa pengaturcaraan mempunyai beberapa pendekatan yang biasa dan berbeza untuk mencari pepijat. Sebagai contoh, program penyahpepijatan dapat digunakan untuk menghilangkan kesalahan dengan cepat. Manakala skrip shell tidak mempunyai alat khusus untuk men-debug kod tersebut. Penulisan ini adalah mengenai membincangkan pelbagai teknik penyahpepijatan yang dapat digunakan untuk menjadikan skrip bash bebas ralat. Sebelum kita menyelami kaedahnya, mari kita memahami asas tentang shell dan scripting shell:







Apakah shell di Linux?

Semasa anda boot komputer anda, kernel mendapat maklumat mengenai perkakasan yang dilampirkan dan membolehkan komponen lain yang terpasang berinteraksi. Selain itu, ia menguruskan memori, CPU dan mengenali setiap periferal baru. Secara keseluruhan, kernel adalah tulang belakang sistem operasi apa pun. Tetapi pernahkah anda terfikir untuk berinteraksi secara langsung dengan kernel, memerintahkannya untuk melakukan tugas tertentu? Adakah ia boleh dilakukan? Tentunya! Dengan bantuan shell, program komputer dengan antara muka interaktif, sesiapa sahaja dapat mengoperasikan kernel. Cengkerang itu memungkinkan manusia berinteraksi dengan kernel dan memerintahkannya untuk melakukan tugas apa pun.



Di Unix, terdapat dua cengkerang utama Cengkerang Bourne dan C shell . Kedua-dua jenis ini mempunyai subkategori mereka. Pelbagai jenis cengkerang Bourne adalah Shell korn (ksh), shell Almquist (abu), shell Bourne lagi (bash), dan Cangkang Z (zsh) . Pada masa yang sama, shell C mempunyai subkategori tersendiri seperti C shell (csh) dan Cangkang TENEX C (tcsh) . Seperti disebutkan di atas, dari semua cangkang, Bash (Bourne lagi shell) adalah shell yang paling banyak digunakan dan keluar dari kotak dalam banyak pengedaran Linux kerana kecekapan dan keramahan pengguna.



Bash adalah shell lalai dari banyak pengedaran Linux dan digunakan secara meluas oleh berjuta-juta pengguna Linux. Sangat beragam dan berpengaruh sehingga dapat melakukan setiap tugas yang biasanya Anda lakukan dalam aplikasi berbasis GUI. Anda boleh mengedit fail, menguruskan fail, melihat foto, mendengar muzik, memainkan video, dan banyak lagi.





Apa itu Skrip Shell:

Oleh kerana kita telah mempelajari idea asas shell, sekarang mari kita menuju skrip shell. Skrip shell adalah program komputer yang menjalankan banyak perintah dalam shell yang bertindak sebagai jurubahasa untuk melakukan fungsi tertentu. Seperti yang dibincangkan di atas, terdapat 2 jenis cengkerang. Walau bagaimanapun, panduan ini memfokuskan pada shell Bourne Again (Bash).
Jadi apa itu skrip bash? Di Linux, semua perintah bash disimpan di / usr / bin dan / bin folder. Sebagai contoh, setiap kali anda menjalankan perintah, bash mencari jika terdapat dalam direktori atau tidak. Perintah akan dilaksanakan jika didapati di direktori lain memberikan ralat.

Bagaimana dengan menjalankan tugas yang memerlukan banyak perintah untuk dijalankan di terminal? Dalam keadaan khusus ini, skrip bash dapat membantu anda. Skrip Bash adalah bentuk skrip shell yang memungkinkan Anda membuat program untuk menjalankan beberapa perintah bash untuk melakukan tugas tertentu.



Apa bug dalam skrip bash:

Semasa bekerja dengan skrip bash atau dengan bahasa pengaturcaraan lain, anda menghadapi banyak kesalahan. Bug adalah ralat atau kesalahan dalam program yang boleh menyebabkan program tersebut bertindak tidak betul.

Setiap bahasa pengaturcaraan mempunyai prosedur tersendiri untuk mencari pepijat; sama, bash juga mempunyai banyak pilihan bawaan untuk men-debug program terminal.

Menguruskan kesilapan dan menyahpepijat program tidak kurang hebatnya. Ini adalah pekerjaan yang memakan masa dan boleh bertambah buruk jika anda tidak mengetahui alat yang tepat untuk men-debug program anda. Penulisan ini adalah panduan lengkap mengenai penyahpepijatan skrip bash untuk menjadikan skrip anda bebas ralat. Jadi mari kita mulakan:

Cara debug skrip bash:

Semasa anda mengerjakan projek pengaturcaraan besar, anda menghadapi banyak kesalahan atau pepijat. Menyahpepijat program kadang-kadang boleh menjadi rumit. Pengaturcara biasanya menggunakan alat debugging, dan banyak penyunting kod juga membantu dalam mencari bug dengan menonjolkan sintaksnya.

Terdapat pelbagai alat di Linux untuk menyahpepijat kod, misalnya, GNU Debugger aka gdb. Alat seperti GDB berguna untuk memprogram bahasa yang disusun menjadi binari. Oleh kerana bash adalah bahasa yang ditafsirkan sederhana, tidak perlu alat berat untuk men-debugnya.

Terdapat pelbagai teknik tradisional untuk men-debug kod skrip bash, dan salah satunya adalah menambahkan Ketegasan. Tegasan adalah syarat yang ditambahkan dalam program untuk memeriksa keadaan tertentu dan melaksanakan program dengan sewajarnya. Ini adalah teknik pertahanan yang membantu dalam mencari bug dan ujian juga. Anda boleh menemui banyak alatan yang membantu menambahkan penegasan dalam skrip bash.

Nah, menambahkan penegasan adalah salah satu teknik tradisional lama. Terdapat set bendera / pilihan yang tersedia dalam bash untuk men-debug skrip bash. Pilihan ini dapat ditambahkan bersama dengan shebang dalam skrip atau ditambahkan ketika menjalankan program di terminal. Topik yang akan kita bahas disenaraikan di bawah:

  1. Cara debug skrip bash dengan mengaktifkan kata kerja -v pilihan
  2. Cara debug skrip bash menggunakan xtrace -x pilihan
  3. Cara debug skrip bash menggunakan noexec -n pilihan
  4. Bagaimana mengenal pasti unset pemboleh ubah semasa debug skrip bash
  5. Bagaimana untuk menyahpepijat bahagian tertentu skrip bash
  6. Cara debug skrip bash menggunakan perangkap arahan
  7. Cara debug skrip bash dengan menghilangkan fail globbing menggunakan -f pilihan
  8. Bagaimana untuk Gabung pilihan debug untuk debug skrip shell
  9. Bagaimana untuk ubah hala-laporan debug ke fail

Oleh itu, mari kita periksa pelbagai teknik dalam bash untuk men-debug skrip bash:

1. Cara debug skrip bash dengan mengaktifkan pilihan verbose -v:

Salah satu pendekatan termudah untuk men-debug skrip bash adalah menggunakan -v pilihan, juga dikenali sebagai verbose. Pilihannya dapat ditambahkan dengan shebang atau dimasukkan secara eksplisit dengan nama fail skrip ketika melaksanakannya. Pilihan verbose akan melaksanakan dan mencetak setiap baris kod sebagai proses oleh jurubahasa. Mari kita fahami dengan contoh skrip bash:

#! / bin / bash
membuang 'Masukkan Nombor1'
membacanombor 1
membuang 'Masukkan Nombor2'
membacanombor2
sekiranya [ '$ nombor1' -gt '$ nombor2' ]
kemudian
membuang 'Number1 lebih besar daripada Number2'
elif [ '$ nombor1' -eq '$ nombor2' ]
kemudian
membuang 'Number1 sama dengan Number2'
yang lain
membuang 'Number2 lebih besar daripada Number1'
menjadi

Kod di atas mendapatkan dua nombor dari pengguna dan kemudian melakukan beberapa penyataan bersyarat untuk memeriksa sama ada nombor itu lebih signifikan, kurang, atau sama dengan nombor yang dimasukkan yang lain. Walaupun mana-mana editor teks dapat digunakan untuk skrip bash, saya menggunakan editor Vim. Vim adalah editor yang kuat dan kaya fitur yang menyoroti sintaks skrip bash dan mengurangkan kemungkinan kesalahan sintaks. Sekiranya anda tidak mempunyai editor Vim, dapatkannya dengan menjalankan perintah yang disebutkan di bawah:

$sudotepatpasang saya datang

Buat fail skrip bash menggunakan:

$saya datangb_script.sh

Sekiranya anda baru menggunakan editor Vim, saya cadangkan anda belajar cara menggunakan editor vim sebelum meneruskan.

Sekarang, kembali ke skrip, jalankan skrip dengan menggunakan -v pilihan:

$bash -vb_script.sh

Dalam output di atas dapat dilihat bahawa setiap baris skrip dicetak di terminal ketika mereka memproses oleh jurubahasa. Perhatikan bahawa skrip akan berhenti mengambil input dari pengguna dan kemudian memproses baris seterusnya skrip. Seperti yang dibincangkan di atas bahawa -v pilihan boleh diletakkan selepas shebang seperti yang ditunjukkan dalam berikut:

#! / bin / bash -v

Begitu juga, bendera verbose juga dapat ditambahkan pada baris berikutnya shebang menggunakan set arahan:

#! / bin / bash
set -v

Mana-mana kaedah yang dibincangkan di atas boleh memungkinkan verbose.

2 Cara debug skrip bash menggunakan pilihan xtrace -x:

Jejak pelaksanaan, juga dikenali sebagai xtrace adalah pilihan debugging pintar dan berguna, terutama untuk mengesan kesalahan logik. Kesalahan logik biasanya dikaitkan dengan pemboleh ubah dan perintah. Untuk memeriksa keadaan pemboleh ubah semasa pelaksanaan skrip, kami menggunakan -x pilihan. Sekarang, jalankan b_script.sh fail dengan -x bendera:

$bash -xb_script.sh

Keluaran secara eksplisit menunjukkan nilai setiap pemboleh ubah semasa proses pelaksanaan. Sekali lagi, -x boleh digunakan di sebelah shebang dan selepas garis shebang menggunakan perintah set. Xtrace meletakkan tanda + dengan setiap baris skrip.

3 Cara debug skrip bash menggunakan pilihan noexec -n:

Kesalahan sintaks adalah salah satu penyebab utama pepijat. Untuk membuat debug skrip bash secara sintaksis, kami menggunakan noexec mod (tiada pelaksanaan). Pilihan yang digunakan untuk mod noexec adalah -n. Ia hanya akan memaparkan kesalahan sintaks kod dan bukannya melaksanakannya. Pendekatan yang lebih selamat untuk menyahpepijat kod. Mari kita laksanakan b_script.sh lagi dengan -n pilihan:

$bash -nb_script.sh

Tidak akan ada pelaksanaan kod jika tidak ada kesalahan sintaks. Sekarang, mari ubah kod kami:

#! / bin / bash

membuang 'Masukkan Nombor1'
membacanombor 1
membuang 'Masukkan Nombor2'
membacanombor2
sekiranya [ '$ nombor1' -gt '$ nombor2' ]
kemudian
membuang 'Number1 lebih besar daripada Number2'
elif [ '$ nombor1' -eq '$ nombor2' ]
#kemudian
membuang 'Number1 sama dengan Number2'
yang lain
membuang 'Number2 lebih besar daripada Number1'
menjadi

Saya mengulas kemudian selepas elif . Sekarang, dengan -n jalankan b_script.sh skrip:

$bash -nb_script.sh

Seperti yang dijangkakan, ia dengan jelas mengenal pasti kesalahan dan menunjukkannya di terminal.

4 Cara mengenal pasti pemboleh ubah yang tidak disetel semasa men-debug skrip bash:

Membuat tipu semasa menulis kod adalah perkara biasa. Selalunya, anda salah menaip pemboleh ubah, yang tidak membiarkan kodnya dilaksanakan. Untuk mengenal pasti kesalahan seperti itu, kami menggunakan -u pilihan. Mari ubah kodnya lagi:

#! / bin / bash
membuang 'Masukkan Nombor1'
membacanombor 1
membuang 'Masukkan Nombor2'
membacanombor2
sekiranya [ '$ num1' -gt '$ nombor2' ]
kemudian
membuang 'Number1 lebih besar daripada Number2'
elif [ '$ nombor1' -eq '$ nombor2' ]
kemudian
membuang 'Number1 sama dengan Number2'
yang lain
membuang 'Number2 lebih besar daripada Number1'
menjadi

Yang pertama sekiranya pernyataan bersyarat, saya menamakan semula nombor 1 berubah menjadi bilangan1 . Sekarang bilangan1 adalah pemboleh ubah tidak disetkan. Sekarang jalankan skrip:

$bash -ub_script.sh

Keluaran telah mengenal pasti dan secara jelas memaparkan nama pemboleh ubah yang tidak disetel.

5. Cara debug bahagian tertentu dari skrip bash:

Mod xtrace memproses setiap baris kod dan memberikan output. Namun, mencari kesalahan dalam kod besar akan memakan masa jika kita sudah mengetahui bahagian mana yang berpotensi menyebabkan kesalahan. Nasib baik, xtrace juga membolehkan anda menyahpepijat bahagian tertentu kod, yang dapat dicapai dengan menggunakan set arahan. Tempat set -x pada awal bahagian yang perlu dibahaskan dan kemudian tetapkan + x pada akhir. Sebagai contoh, saya ingin menyahpepijat penyataan bersyarat dari b_script.sh , jadi saya akan melampirkan semua pernyataan bersyarat di set -x dan tetapkan + x pilihan seperti yang ditunjukkan dalam kod di bawah:

#! / bin / bash
membuang 'Masukkan Nombor1'
membacanombor 1
membuang 'Masukkan Nombor2'
membacanombor2
set -x
sekiranya [ 'nombor $' -gt '$ nombor2' ]
kemudian
membuang 'Number1 lebih besar daripada Number2'
elif [ '$ nombor1' -eq '$ nombor2' ]
kemudian
membuang 'Number1 sama dengan Number2'
yang lain
membuang 'Number2 lebih besar daripada Number1'
menjadi
set+ x

Sekarang, jalankan skrip menggunakan bash b_script.sh .

Keluarannya hanya men-debug keadaan if seperti yang ditentukan.

6. Cara debug skrip bash menggunakan perintah perangkap:

Sekiranya skrip anda rumit, maka ada teknik yang lebih terperinci juga untuk penyahpepijatan. Salah satunya ialah perangkap arahan. The perangkap arahan menangkap isyarat dan melaksanakan perintah apabila situasi tertentu berlaku. Perintah boleh berupa isyarat atau fungsi. Saya telah membuat skrip lain dengan nama jumlah_script.sh :

#! / bin / bash
perangkap Garis 'echo' $ {LINENO}: Nombor pertama ialah $ number1, nombor kedua adalah $ number2 dan jumlahnya adalah $ sum ''HUTANG
membuang 'Masukkan nombor pertama'
membacanombor 1
membuang 'Masukkan nombor kedua'
membacanombor2
jumlah= $[nombor1 + nombor2]
membuang 'jumlahnyajumlah $'

The perangkap perintah dengan HUTANG isyarat memaparkan status pemboleh ubah nombor 1 , nombor2 dan jumlah setelah pelaksanaan setiap baris seperti yang ditunjukkan dalam gambar output berikut:

Blok kuning adalah ruang kosong kerana pengguna belum memasukkan input; ruang-ruang ini akan dipenuhi semasa pengguna memasukkan nilai. Kaedah ini juga sangat membantu dalam debug skrip bash.

7. Cara debug skrip bash dengan menghilangkan fail globbing menggunakan pilihan -f:

File globbing adalah proses mencari fail dengan watak wildcard, iaitu, * dan ? . Dalam banyak keadaan, anda tidak perlu mengembangkan fail semasa melakukan debug. Dalam kes sedemikian, anda boleh menyekat fail yang menggunakan glob menggunakan -f pilihan. Mari fahami dengan skrip fglobe_script.sh :

#! / bin / bash
membuang 'Paparkan semua fail teks.'
ls *.txt

Kod di atas akan memaparkan semua fail teks dalam direktori semasa, jalankan:

$bashfglobe_script.sh

Untuk mematikan globbing fail, gunakan -f pilihan:

$bash -ffglobe_script.sh

Begitu juga, anda boleh menggunakannya dengan shebang dan dengan set arahan juga:

#! / bin / bash
membuang 'Paparkan semua fail teks.'
ls *.txt
set -f
membuang 'Paparkan semua fail teks'
ls *.txt
set+ f

Sekarang, jalankan bash fglobe_script.sh:

Bahagian ditutup dengan set -f / set + f pilihan tidak memproses perintah dengan watak wildcard.

8. Cara menggabungkan pilihan debug untuk men-debug skrip shell:

Kami hanya menggunakan satu pilihan dalam teknik debugging yang disebutkan di atas, tetapi kami dapat menggabungkan pelbagai pilihan untuk pemahaman yang lebih baik. Mari kita laksanakan -x dan -v pilihan untuk jumlah_script.sh skrip. Saya menggunakan jumlah_script.sh skrip.

#! / bin / bash
membuang 'Masukkan nombor pertama'
membacanombor 1
membuang 'Masukkan nombor kedua'
membacanombor2
jumlah= $[nombor1 + nombor2]
membuang 'jumlahnyajumlah $'

Sekarang jalankan:

$bash -xvjumlah_script.sh

Kedua-duanya -x dan -v output digabungkan, seperti yang ditunjukkan dalam gambar output. Begitu juga, kita juga boleh menggabungkan -u pilihan dengan verbose -v untuk pengesanan ralat. Saya menggantikan nombor 1 pemboleh ubah dengan pada satu pada baris keenam skrip:

#! / bin / bash
adalah$ nombor2danjumlahadalahjumlah $'' DEBUG
membuang '
Masukkan nombor pertama'
membaca nombor1
membuang '
Masukkan nombor kedua'
membaca nombor2
jumlah = $ [bilangan + nombor2]
membuang '
yangjumlahadalahjumlah $'

Untuk melihat output, jalankan arahan yang disebutkan di bawah:

$bash -uvjumlah_script.sh

9. Cara mengarahkan laporan debug ke fail:

Menyimpan laporan debug skrip bash ke fail boleh berguna dalam banyak keadaan. Agak sukar kerana untuk mengarahkan laporan debug ke fail; kami menggunakan beberapa pemboleh ubah khas. Mari kita laksanakan b_script.sh kod:

#! / bin / bash
exec 5>dubug_report.log
DIBAYAR_XTRACED='5'
PS4='$ LINENO--'
membuang 'Masukkan Nombor1'
membacanombor 1
membuang 'Masukkan Nombor2'
membacanombor2
sekiranya [ 'nombor $' -gt '$ nombor2' ]
kemudian
membuang 'Number1 lebih besar daripada Number2'
elif [ '$ nombor1' -eq '$ nombor2' ]
kemudian
membuang 'Number1 sama dengan Number2'
yang lain
membuang 'Number2 lebih besar daripada Number1'
menjadi

Pada baris kedua kod, dapat dilihat bahwa kita mengarahkan output ke a debug_report.log fail menggunakan exec arahan dengan deskriptor fail 5 (FD5).

exec 5> debug_report.log: The exec arahan mengarahkan semua yang berlaku di shell ke fail debug_report.log.

BASH_XTRACEFD = 5: Ia adalah pemboleh ubah bash tertentu dan tidak boleh digunakan di cangkang lain. Ia perlu diberikan deskriptor fail yang sah, dan bash akan menulis output yang diekstrak ke debug_report.log.

PS4 = ’$ LINENO– ': Ini juga merupakan variabel bash yang digunakan untuk mencetak nombor baris ketika melakukan debug menggunakan mod xtrace. Nilai lalai PS4 adalah yang + tanda

Skrip di atas menghasilkan fail log yang dipanggil debug_report.log, untuk membacanya, gunakan kucing arahan:

Kesimpulan:

Kod yang penuh dengan pepijat boleh mempengaruhi prestasi program dan membahayakan perkakasan juga. Penyahpepijatan sangat penting untuk setiap program kerana menjadikan program lebih efisien. Mencari kesalahan yang ada dan berpotensi semasa pembangunan program dapat mengelakkan program anda berkelakuan tidak disangka-sangka. Kod besar biasanya memerlukan penyahpepijatan aktif, meningkatkan keberkesanan kod dengan menghilangkan jalan keluar yang menggunakan potongan kod.

Banyak bahasa dan persekitaran pengaturcaraan mempunyai pendebog pendamping mereka sendiri. Dalam skrip bash, pelbagai teknik dapat dilaksanakan untuk men-debug skrip. Panduan ini memberi tumpuan sepenuhnya kepada semua kaedah yang boleh digunakan untuk mencari bug dalam skrip bash. Oleh itu, setiap kali anda merasakan bahawa skrip bash anda tidak berperilaku seperti yang diharapkan, gunakan teknik yang disebutkan di atas, tetapi mod xtrace (-x) cukup membantu dalam kebanyakan kes.