我正在编写一个shell脚本,它循环遍历一些值,并为每个值运行沿着命令行。我想在整个过程中打印出这些命令,就像make
在运行makefile时所做的那样。我知道我可以在运行它们之前“回显”所有命令,但这感觉不太优雅。所以我正在研究set -x
和类似的机制:
#!/bin/sh
for value in a long list of values
do
set -v
touch $value # imagine a complicated invocation here
set +v
done
我的问题是:在每次迭代中,不仅会打印出有趣的行,还会打印出set +x
行。是否有可能防止这种情况?如果没有,您推荐什么解决方案?
PS:上面的MWE使用sh
,但我也安装了bash
和zsh
,以防有帮助。
4条答案
按热度按时间jdg4fx2g1#
将其沙盒到subshell中:
当然,在该子shell中对变量或环境所做的更改将丢失。
如果你真的关心这个,你也可以使用DEBUG陷阱(使用
set -T
使它被函数继承)来实现你自己的set -x
等价物。例如,如果使用bash:
也就是说,发出BASH_COMMAND(如DEBUG陷阱所做的)并不完全等同于
set -x
;例如不显示扩展后的值。s4n0splo2#
您想尝试使用单行xtrace:
原始命令在同一个shell中执行身份转换。在运行之前,您会获得参数的非递归xtrace。这允许您对您关心的命令进行xtrace,而不会向stederr发送每个“echo”命令的重复副本。
eanckbw93#
下一个命令禁用“xtrace”选项:
$ set +o xtrace
hpxqektj4#
我想到了
但得到了
我对这些结果感到惊讶.....但是
看起来符合你的要求。
当我把每个语句放在它的唯一一行时,我看到了类似的结果(set +x除外)
IHTH。