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?
bash -l
? Itu dimaksudkan untuk kerang interaktif. Script bukan shell interaktif.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 -x
akan menunjukkan kepada Anda. Terkadang Anda ingin tahu di mana variabel env sedang diatur.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.
sumber