我使用set -x
在shell脚本A.sh
中实现调试标志:如果我调用A.sh -d
-d
标志将导致{{1}被叫。
在set -x
中执行的每一行将打印到stderr,前缀为A.sh
。到目前为止一切都很好。
此时我正在编写具有相同特征的脚本+
:B.sh
还会打印每行B.sh -d
前缀。
我想从+
内拨打A.sh
,并传播B.sh
标志。
在这里我们遇到了问题:无法区分-d
发出的命令和A.sh
发出的命令,因为两者都将以B.sh
开头。
可能的解决方案是从+
内拨打A.sh
,如下所示:
B.sh
但这有点难看,可能不太便携。 还有更好的主意吗?
在 chepner 的想法之后,我只是按照以下方式实施了调试模式:
propagate_options='-d'
A.sh $propagate_options 2> >(sed 's/^\+/++/')
这样可以更容易理解什么是......
的输出答案 0 :(得分:3)
set -x
使用PS4
的当前值作为每行输出的标记。
PS4
当执行执行跟踪(set -x)时 交互式shell,在执行跟踪中的每一行之前的值 该变量应进行参数扩展和写入 标准错误。默认值为“+”。这卷 POSIX.1-2008仅指定变量对系统的影响 支持用户可移植性实用程序选项。
答案 1 :(得分:1)
最“自然”的方式是获取文件。 shell认识到这一点,并且因为你正在传播调试。踢 - 每个源将在开头自动添加“+”。这是a.bash
:
#!/bin/bash
set -x
echo 1
echo 2
. b.bash
和b.bash
:
#!/bin/bash
echo a
echo b
运行a.bash
会导致:
+ echo 1
1
+ echo 2
2
+ . b.bash
++ echo a
a
++ echo b
b
请注意,b
命令有两个++
。