调试bash/ksh脚本和子脚本

8
我知道要调试脚本,可以使用命令:
set -x 

第一行问题是,当脚本启动其他脚本时,它们不会继承此设置。所以我的问题是,是否有可能为shell和所有子shell或某个脚本及其启动的所有脚本全局设置此标志?


有必要使用子shell吗? - devnull
2
+1 当然,你无法阻止内部脚本明确关闭该选项,但除了使用 bash -$- 调用每个脚本之外,我没有看到其他方法。好奇地等待答案。 - kojiro
@kojiro 你永远不应该需要编辑源文件来调试,因为这本身就是引入错误的源头。正确的做法是将调试标志传递给命令行上的bash,并使用SHELLOPTS。参见:https://dev59.com/BHfZa4cB1Zd3GeqPX_Og#56136968 - RichieHH
我不认为我说了你似乎认为我说的话,这已经是八年前的事了。 - kojiro
3个回答

8
在Bash中,您可以使用export SHELLOPTS命令。这将使所有的Bash子shell都继承-x选项(以及SHELLOPTS中的所有其他选项!)。
例如:
export SHELLOPTS
bash -x script1.sh

请参见 bash递归xtrace

0

这要看情况,你也可以使用 -x 来调用你的子shell。


2
我不想修改每个脚本的调用,因为主脚本可以调用一些子脚本,而子脚本也可以调用一些脚本,所以修改每个调用是不现实的。 - Trismegistos
@Trismegistos,不用担心。你想要什么以及为什么很明显。 - RichieHH

-1
set -x 放在 Shell 脚本内。
$ cat shell1.sh
echo "Shell1"

$ cat shell2.sh
#!/bin/bash
set -x
./shell1.sh
echo "shell2.sh"

$ ./shell2.sh
+ ./shell1.sh
Shell1
+ echo shell2.sh
shell2.sh

正如您所看到的,shell2.sh 中的每个命令都会输出到屏幕上,但是 shell1.sh 中的命令不会输出到屏幕上,因为 -x 标志没有被 shell1.sh 脚本继承。我想要实现的是让 shell1.sh 也将命令输出到屏幕上,而且不需要修改 shell1.sh 脚本。请注意,实际上 shell1.sh 还会调用其他一些脚本,我也希望它们能够继承 -x 标志。 - Trismegistos
啊,如果不修改shell1.sh的话,这就有点棘手了。让我们等待其他人发布他们的答案。 - Sathy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接