我正在使用“set -x”启用bash脚本中的命令回显。当我关闭回声时,我发出“set + x”但我不希望该命令回显。为此,我发出命令:
{ set +x; } 2>/dev/null
这很好用。但是,我并不完全理解为什么会这样,以下情况不会:
set +x 2>/dev/null
显然命令的回显并没有发给stderr,但我真的不明白为什么花括号中带分号的命令有效。
你需要使用大括号的原因是xtrace
日志记录(你试图压制的+ set +x
行)不是从命令set +x
本身输出的(这个命令本身不会对stderr或stdout写入任何内容)。相反,它是从shell调用set +x
的输出。
当你运行set +x 2>/dev/null
时,将stderr重定向到/dev/null
只是为了执行set +x
本身。在设置运行该命令时,它不会重定向shell执行的操作,包括打印跟踪日志。
相比之下,当您运行{ set +x; } 2>/dev/null
时,它会在运行整个代码块之前执行重定向,其中包括对该块中每个命令的自然预命令设置。因此,命令的设置也在重定向环境中运行。
如果set -x
没有记录它曾引用过someprogram 2>/dev/null
,那么你不会想要它本来是什么用someprogram
?
顺便说一句,这非常类似于shell-builtin time
命令的输出不受重定向的原因,除非包含在更大的上下文中;有关更多信息,请参阅BashFAQ #32。