Bagaimana cara men-debug skrip bash?

31

Apakah ada cara untuk men-debug skrip bash tanpa menggunakan gema dan pencatatan?

Saya sedang berbicara tentang menggunakan breakpoints dan hal-hal seperti itu.

UAdapter
sumber

Jawaban:

20

Ada beberapa cara berbeda, yaitu:

  • Jalankan skrip Anda dengan opsi -x

    bash -x yourscript.sh
  • Tambahkan set -xbaris baru di awal scriptfile Anda setelah Shebang #!/bin/bashdan sebelum awal script Anda, set -vakan menampilkan baris input shell, set -xmenampilkan perintah dan argumen yang dieksekusi

  • ganti shebang file skrip Anda dengan #!/bin/bash -xv

NES
sumber
4

Anda dapat menggunakan fungsi kecil ini untuk masuk ke "konsol":

function debug
{
    echo "#############|  Entering DEBUG mode  |####################";
    cmd=""
    while [[ $cmd != "exit" ]]; do
        read -p "> " cmd
        case "$cmd" in
            vars ) ( set -o posix ; set );;
            exit ) ;;
            * ) eval "$cmd";;
        esac
    done
    echo "#############|  End of DEBUG mode |####################";
}

Lalu, di dalam skrip Anda (CONTOH):

for file in *; do
...
   if [[ $file == "strange_case.txt" ]]; then
       # break the code here to analyze:
       debug
   fi
...
done

Ini akan menerima perintah apa pun, menjaga variabel lokal tetap utuh. Untuk keluar dari mode "debug", ketik "exit" (itu tidak akan keluar dari skrip) dan itu akan melanjutkan dengan kode. Jika Anda menggunakan "debug" di dalam satu lingkaran, itu akan berhenti setiap waktu. Anda dapat membungkusnya di dalam "jika" (seperti dalam contoh di atas), atau membuat fungsi "arloji":

function debug_watch
{
    if [[ $1 == $2 ]]; then
        debug
    fi
}

# And Use it:

debug_watch "$file" "strange_case.txt"

Saya juga menambahkan perintah "vars" yang akan membuang semua variabel yang tersedia dan nilainya. Anda dapat menambahkan perintah kustom Anda sendiri juga.

Saya melakukan kode dalam beberapa menit jadi gunakan dengan risiko Anda sendiri. Sadarilah bahwa dalam mode debug, perintah apa pun dapat dijalankan, sehingga menimbulkan risiko keamanan jika Anda membiarkannya dalam skrip produksi.

lepe
sumber
3
Hindari menggunakan nama variabel huruf besar. Risiko Anda mengabaikan variabel shell khusus dan variabel lingkungan. Juga, pastikan Anda mengutip ekspansi parameter saat digunakan sebagai argumen, untuk menghindari pemisahan kata dan perluasan nama path yang terjadi pada hasilnya. misalnya * ) eval "$cmd" ;;dan debug_watch "$file" strange_case.txt.
geirha
Kode yang diedit seperti yang disarankan oleh geirha.
Lepe
2

Untuk menyetel apa yang dikatakan NES, ada set flag di bash untuk memungkinkan debugging.

The set -xflag dapat menetapkan dan diset baik dari terminal, atau dari dalam naskah Anda. Menggunakan +atau -:

#!/bin/bash
#fileinfo
ls -l $1
set -x      # start debugging here
wc -l $1
set +x      # stop debugging here
file $1
set -v      # start verbose output
w | more    
echo ""
echo -n "Number of users: "
set +v      # end verbose output
who | wc -l

Inilah yang setdilakukan perintah:

  • set -f Nonaktifkan pembuatan nama file menggunakan metacharacters.
  • set -v Mencetak (verbose) baris input shell saat dibaca.
  • set -x Cetak jejak perintah sebelum menjalankan perintah.

setsebenarnya memiliki banyak fitur, tetapi sayangnya tidak ada halaman manual karena merupakan alat bawaan shell. Manual untuk set ada di dokumentasi Bash GNU .

Ada banyak alat baris perintah yang dapat membantu Anda memperoleh detail tentang program Anda seperti:

  • stat menampilkan file atau status sistem file
  • file tentukan jenis file.
  • hexdump filter yang menampilkan file yang ditentukan dalam berbagai format
  • nohup Jalankan skrip yang tidak akan hang

    dan banyak lainnya. Saya mencoba memikirkan perintah yang menunjukkan karakter tersembunyi, tetapi saya tidak bisa melakukannya sekarang. Hexdump akan melakukannya tetapi ada yang lebih baik.

Perintah kuncinya ctrl\ akan menyebabkan program atau skrip yang berjalan ke dump inti. Maka Anda bisa menganalisis coredump. Saya mungkin akan menggunakan gdb untuk menganalisis coredump, tetapi ada banyak program untuk itu.

Bash shell memiliki beberapa opsi bagus untuk debugging juga. opsi --debugger, kata kerja -v, --dump-stringsdan opsi bagus lainnya untuk membantu Anda. Lihat menggunakan man bash.

The trapperintah (shell built in) bisa sangat membantu bagi Anda. trap mengatakan jika program Anda keluar secara tidak terduga, jalankan sesuatu. Anda membaca tentang jebakan, dan built-in Bash Shell berguna lainnya di sini .

Berbicara secara umum untuk saat ini, debugging adalah topik besar dalam bahasa apa pun. Beberapa topik lain yang berguna untuk debugging dalam bahasa pemrograman apa pun termasuk, pengalihan shell dan, pemrosesan sinyal.

Akhirnya, saya menyadari contoh yang saya gunakan adalah sepele, tetapi beberapa skrip shell bisa ratusan baris. Dalam situasi itu, saya suka menyisipkan tag komentar dan memblokir kode yang saya curigai salah, atau Atau, menyisipkan perintah keluar, dan mencoba untuk mengisolasi kode fungsional dari kode yang rusak, menggunakan teknik membagi dan menaklukkan.

j0h
sumber
1

Opsi GUI untuk men-debug skrip bash adalah Eclipse IDE dengan BashEclipse / Pluggins yang dikupas.

Ini memberikan fitur pertanyaan Anda ( breakpoints and stuff) bersama dengan sejumlah fitur lain untuk debugging skrip bash kompleks.

Beberapa fitur termasuk:
( https://unix.stackexchange.com/questions/155551/how-to-debug-a-bash-script )

  • Istirahatkan matikan
  • Operasi langkah demi langkah tunggal
  • Step-in, Step-out, Fungsi step-over dan sub-rutin
  • Memeriksa variabel kode di titik mana pun saat skrip berjalan
  • Daftar tugas TODO
  • Daftar bookmark
  • Pengeditan Banyak Jendela
  • Berbagi jarak jauh dari lingkungan proyek

Perspektif Editor Skrip: Eclipse Script IDE

Perspektif Debugging: Perspektif Debug Script Eclipse

Langkah-langkah untuk menggunakan adalah menambahkan Shelleddan BashEclipsepluggin ke gerhana. Kemudian jalankan prosedur yang disediakan di BashEclipse, baca file teks saya untuk memulai debugger.

LD James
sumber