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?

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.


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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.