Saya memiliki skrip uji yang memiliki banyak perintah dan akan menghasilkan banyak keluaran, saya menggunakan set -x
atau set -v
dan set -e
, sehingga skrip akan berhenti ketika terjadi kesalahan. Namun, masih agak sulit bagi saya untuk menemukan jalur mana yang menghentikan eksekusi untuk menemukan masalahnya. Apakah ada metode yang dapat menampilkan nomor baris skrip sebelum setiap baris dieksekusi? Atau keluaran nomor baris sebelum pameran perintah dibuat oleh set -x
? Atau metode apa pun yang dapat menangani masalah lokasi baris skrip saya akan sangat membantu. Terima kasih.
89
echo
echo
sebaiknya hindari pernyataan yang tidak perlu .-x
harus mencetak nomor baris. Atau, mungkin -nx
harus menyertakan nomor baris. Bagi saya, ini salah satu momen "WTF" ...\033[0;33m+(${BASH_SOURCE}:${LINENO}):\033[0m ${FUNCNAME[0]:+${FUNCNAME[0]}(): }'
untuk beberapa warnaDi Bash,
$LINENO
berisi nomor baris tempat skrip sedang dieksekusi.Jika Anda perlu mengetahui nomor baris tempat fungsi itu dipanggil, coba
$BASH_LINENO
. Perhatikan bahwa variabel ini adalah array.Sebagai contoh:
#!/bin/bash function log() { echo "LINENO: ${LINENO}" echo "BASH_LINENO: ${BASH_LINENO[*]}" } function foo() { log "$@" } foo "$@"
Lihat di sini untuk detail variabel Bash.
sumber
Solusi sederhana (tapi kuat): Letakkan di
echo
sekitar kode yang menurut Anda menyebabkan masalah dan pindahkanecho
baris demi baris hingga pesan tidak muncul lagi di layar - karena skrip telah berhenti karena kesalahan sebelumnya.Solusi yang lebih kuat: Instal
bashdb
debugger bash dan debug skrip baris demi barissumber
echo
mempelajari sesuatu dapat membantu dalam banyak kasus, tetapi gagal saat Anda mencoba menerapkannya dalam fungsi yang memiliki keluaran yang bermakna dan dapat diurai.echo "foo" >&2
Solusi untuk cangkang tanpa LINENO
Dalam skrip yang cukup canggih, saya tidak ingin melihat semua nomor baris; melainkan saya ingin mengontrol output.
Tentukan fungsi
echo_line_no () { grep -n "$1" $0 | sed "s/echo_line_no//" # grep the line(s) containing input $1 with line numbers # replace the function name with nothing } # echo_line_no
Gunakan dengan tanda kutip seperti
echo_line_no "this is a simple comment with a line number"
Outputnya adalah
16 "this is a simple comment with a line number"
jika jumlah baris ini di file sumber adalah 16.
Ini pada dasarnya menjawab pertanyaan Bagaimana cara menampilkan nomor baris saat menjalankan skrip bash untuk pengguna ash atau shell lain tanpa
LINENO
.Ada lagi yang ingin ditambahkan?
Tentu. Mengapa Anda membutuhkan ini? Bagaimana Anda bekerja dengan ini? Apa yang dapat Anda lakukan dengan ini? Apakah pendekatan sederhana ini benar-benar cukup atau berguna? Mengapa Anda ingin mengotak-atik ini?
Ingin tahu lebih banyak? Baca refleksi tentang debugging
sumber