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


10

我正在尝试调试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的来源,但不会显示其命令。有没有升级的解决方法?这是由版本差异引起的吗?

Answers:


1

set -x根文件中的某个位置(需要其他所有文件的位置)应该可以工作。或者,[[ !-z "$DEBUG" ]] && set -x在每个文件中引入类似内容,然后使用进行调用DEBUG=1 script.sh


根文件在哪里?它是平台独立的吗?
开尔文2012年

对于“根文件”,我只是表示您正在外壳程序上调用的文件,并且正在导入其他文件。在我的示例中,根文件为script.sh
mkaito 2012年

1
但是bash登录初始化是在脚本运行之前发生的。在脚本中运行“ set -x”为时已晚。自己尝试-运行“ bash -l -x script.sh”。您将看到运行脚本命令之前发生的事情。
开尔文

为什么在地球上运行脚本bash -l?那是为了交互式外壳。脚本不是交互式外壳。
mkaito 2012年

3
请更加开放-bash的创建者显然认为它会很有用。我看到了2种用法(至少):1)您要运行,ssh user@host 'bash -l -c command'以便加载正确的环境。2)您是系统管理员,想脚本运行之前对初始化脚本的功能进行故障排除 - 将向您显示。有时您想知道env变量的设置位置。bash -l -x
开尔文2012年

0

由于您正在采购脚本且未执行,因此主脚本中的第一个命令应为“ set -x”

现在,所有源脚本都将在debug中运行。请记住,当您编写脚本源时,它会在当前的shell中运行,因此,如果您一次设置-x,则对所有源脚本都非常有用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.