除非用大括号括起来,为什么“ set -x”(xtrace)输出不受重定向?

时间:2019-03-21 15:03:35

标签: bash

我正在使用“ set -x”在bash脚本中启用命令回显。当我关闭回显时,我发出的是“ set + x”,但是我不希望该命令回显。为此,我发出命令:

{ set +x; } 2>/dev/null

这很好。但是,我尚不完全了解为什么这样做,而以下内容则无效:

set +x 2>/dev/null 

显然,命令的回显并没有传递给stderr,但我不太了解为什么花括号中带有分号的命令起作用。

1 个答案:

答案 0 :(得分:6)

您需要使用花括号的原因是xtrace日志记录(您要禁止的+ set +x行)不会从命令{{1} }本身(本身不会向stderr stdout写入任何内容的命令)。而是从 shell调用 set +x的输出。

运行set +x时,这会将stderr重定向到set +x 2>/dev/null ,仅用于执行/dev/null本身。在设置运行该命令(包括打印跟踪日志)时,它不会重定向外壳程序所做的事情。

相反,当您运行set +x时,它将在运行整个代码块之前进行重定向 ,这自然包括为该块中的每个命令设置预命令。因此,该命令的设置也将在重定向环境中运行。

您不希望这样-如果{ set +x; } 2>/dev/null根本不记录它已经调用了set -xsomeprogram 2>/dev/null会有什么用?


顺便说一句,这与为什么shell-builtin someprogram命令的输出不进行重定向(除非在更大的上下文中进行包装)非常相似;有关更多信息,请参见BashFAQ #32