如何使“bash -x”(调试模式)递归到源脚本?

如何使“bash -x”(调试模式)递归到源脚本?

我正在尝试调试 bash 在 Linux 登录初始化时所做的事情。我读到“bash -x”会让 bash 打印出它正在做的事情,但它不会像“set -x”那样在源文件中打印命令。我不能使用“set -x”,因为初始化在我调用它之前运行。“bash -x”似乎在 OS X 上可以很好地递归,但这可能是因为 bash 版本。

Linux:3.2.25

OS X: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,这将适用于所有源脚本。

相关内容