我正在使用“ set -x”在bash脚本中启用命令回显。当我关闭回显时,我发出的是“ set + x”,但是我不希望该命令回显。为此,我发出命令:
{ set +x; } 2>/dev/null
这很好。但是,我尚不完全了解为什么这样做,而以下内容则无效:
set +x 2>/dev/null
显然,命令的回显并没有传递给stderr,但我不太了解为什么花括号中带有分号的命令起作用。
答案 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 -x
,someprogram 2>/dev/null
会有什么用?
顺便说一句,这与为什么shell-builtin someprogram
命令的输出不进行重定向(除非在更大的上下文中进行包装)非常相似;有关更多信息,请参见BashFAQ #32。