内置表达式set -x
打开跟踪,它在通配符之后但执行之前打印每个命令。我很好奇的是set -x
在不同的上下文中提供的输出的差异。
当我跑步时,bash -c 'set -x; echo "hello"'
我们看到...
+ echo hello
hello
当我跑步时,bash -c '(set -x; echo "hello")'
我们看到...
+ echo hello
hello
当我跑步时,bash -c 'hi=$(set -x; echo "hello")'
我们看到...
++ echo hello
+
有谁知道为什么最后一种情况有双重?
答案1
引用Bash 手册为了set -x
:
在扩展之后和执行之前打印简单命令、
for
命令、case
命令select
、命令和算术命令及其参数或关联单词列表的痕迹。变量for
的值PS4
被扩展,并且结果值在命令及其扩展参数之前打印。
PS4
是被形容为:
该参数的值扩展如下PS1
-x
扩展值是设置选项时在回显命令行之前打印的提示(请参阅内置集合)。扩展值的第一个字符根据需要被复制多次,以指示多个间接级别。默认值为“+
”。
重复的+
符号表示间接级别:
set -x; echo "hello"
以单一级别运行;hi=$(set -x; echo "hello")
以two运行:用于替换的子shell环境是第二级。
间接级别不从命令set -x
运行的级别开始计算;它们是从“主”壳开始计算的。
这种字符复制是 Bash 所独有的;其他贝壳不以这种方式指示贝壳深度。