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

问题描述 投票:2回答:1

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

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

这很好用。但是,我并不完全理解为什么会这样,以下情况不会:

set +x 2>/dev/null 

显然命令的回显并没有发给stderr,但我真的不明白为什么花括号中带分号的命令有效。

bash
1个回答
6
投票

你需要使用大括号的原因是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

© www.soinside.com 2019 - 2024. All rights reserved.