在[ba] sh中传播`set -x`

时间:2017-10-19 11:44:34

标签: bash sh

我使用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/^\+/++/')

这样可以更容易理解什么是......

的输出

2 个答案:

答案 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命令有两个++