Bagaimana cara saya membuat "bash -x" (mode debug) berulang menjadi skrip bersumber?

9

Saya mencoba men-debug apa yang dilakukan bash pada inisialisasi login untuk Linux. Saya telah membaca bahwa "bash -x" akan membuat bash mencetak apa yang dilakukannya, tetapi tidak mencetak perintah dalam file-file bersumber seperti "set -x". Saya tidak dapat menggunakan "set -x" karena inisialisasi berjalan sebelum saya dapat menyebutnya. "bash -x" tampaknya muncul kembali dengan baik di OS X, tapi itu mungkin karena versi bash.

Linux: 3.2.25

OS X: 3.2.48

Berikut adalah kutipan dari perilaku tidak berulang di Linux:

bash -l -x -c 'echo 1'
# ... snip ...
+ for i in '/etc/profile.d/*.sh'
+ '[' -r /etc/profile.d/vim.sh ']'
+ '[' '' ']'
+ . /etc/profile.d/vim.sh
+ for i in '/etc/profile.d/*.sh'
+ '[' -r /etc/profile.d/which-2.sh ']'
+ '[' '' ']'
+ . /etc/profile.d/which-2.sh
# ... snip ...

Perhatikan bagaimana /etc/profile.d/vim.sh bersumber, tetapi perintahnya tidak dicetak. Apakah ada solusi tanpa peningkatan? Apakah ini disebabkan oleh perbedaan versi?

Kelvin
sumber

Jawaban:

1

set -xsuatu tempat di file root (yang membutuhkan semua file lain) harus berfungsi. Atau, perkenalkan sesuatu seperti [[ !-z "$DEBUG" ]] && set -xdi setiap file, dan panggil dengan DEBUG=1 script.sh.

mkaito
sumber
Di mana file root? Apakah platform independen?
Kelvin
Dengan "root file" Maksud saya adalah file yang Anda panggil di shell, dan yang mengimpor file lain. Dalam contoh saya, file root adalah script.sh
mkaito
1
Tetapi inisialisasi bash login terjadi sebelum skrip dijalankan. Sudah terlambat untuk menjalankan "set -x" dalam skrip. Cobalah sendiri - jalankan "bash -l -x script.sh". Anda akan melihat hal-hal terjadi sebelum perintah skrip Anda dijalankan.
Kelvin
Kenapa Anda harus menjalankan skrip bash -l? Itu dimaksudkan untuk kerang interaktif. Script bukan shell interaktif.
mkaito
3
Harap sedikit lebih berpikiran terbuka - jelas pencipta bash berpikir itu akan berguna. Saya melihat 2 penggunaan (setidaknya): 1) Anda ingin menjalankan ssh user@host 'bash -l -c command'sehingga Anda mendapatkan env yang tepat dimuat. 2) Anda seorang sysadmin dan ingin memecahkan masalah apa yang dilakukan skrip init sebelum skrip Anda berjalan - bash -l -xakan menunjukkan kepada Anda. Terkadang Anda ingin tahu di mana variabel env sedang diatur.
Kelvin
0

Karena Anda mencari skrip dan tidak mengeksekusi, perintah pertama Anda dalam skrip utama adalah "set -x"

Sekarang semua skrip bersumber akan berjalan di debug lebih banyak. Ingat ketika Anda sumber skrip, itu berjalan di shell Anda saat ini, jadi jika Anda mengatur -x sekali, itu akan baik untuk semua skrip sumber.

Sam
sumber