
我正在嘗試調試 bash 在 Linux 登入初始化中的作用。我讀過“bash -x”將使 bash 列印出它正在做什麼,但它不會像“set -x”那樣列印原始檔案中的命令。我無法使用“set -x”,因為初始化在我調用它之前運行。 「bash -x」似乎在 OS X 上遞歸得很好,但這可能是因為 bash 版本的原因。
Linux:3.2.25
作業系統:3.2.48
以下是 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 ...
請注意 /etc/profile.d/vim.sh 是如何取得的,但它的命令不會被列印。有沒有不用升級的解決方法?這是版本差異造成的嗎?
答案1
set -x
根文件中的某處(需要所有其他文件的文件)應該可以工作。或者,[[ !-z "$DEBUG" ]] && set -x
在每個文件中引入類似的內容,然後使用DEBUG=1 script.sh
.
答案2
由於您正在獲取腳本而不是執行,因此主腳本中的第一個命令應該是“set -x”
現在,所有來源腳本都將在偵錯中運行更多。請記住,當您取得腳本時,它會在您目前的 shell 中執行,因此如果您設定 -x 一次,這將對所有來源腳本都有好處。