在子 shell 中跟踪(设置 -x)

在子 shell 中跟踪(设置 -x)

内置表达式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 所独有的;其他贝壳不以这种方式指示贝壳深度。

相关内容