在 POSIX shell 脚本函数中使用 exec 1>&2。它会干扰其他 io 重定向吗?

在 POSIX shell 脚本函数中使用 exec 1>&2。它会干扰其他 io 重定向吗?

我正在编写 POSIX shell 脚本。

我有一个函数,它将(几乎)所有输出重定向到标准错误流,如下所示:

# print something to stderr
printf "..." $var 1>&2

有人向我指出,有一种方法可以使用以下方法重定向所有函数的输出:

# redirect all output to standard error stream
exec 1>&2

将此行保留在函数的开头。

如果没有其他重定向,我可能会同意,但我有一个颜色支持测试:

# check if we have color support
if command -v tput > /dev/null 2>&1 && tput setaf 1 > /dev/null 2>&1

基本上,我不知道它是如何exec工作的,而且我现在不需要了解太多细节,我只需要知道该exec行是否会干扰上述颜色支持测试?

答案1

exec <redirection>将重定向当前 shell(或子 shell)的 I/O 流。由于 shell 启动的命令继承了 shell 的 I/O 流,因此这些重定向将影响它们,并在顶部应用特定于命令的重定向。

所以,像这样:

exec >/some/file 2>&1
foo >/another/file
  • 之后exec,shell 的 stdout 转到/some/file,stderr 也转到/some/file
  • 当启动 foo 时,shell 将 foo 的 stdout 重定向到/another/file,但 stderr 被继承不变,并将转到/some/file

在这些命令中:

command -v tput > /dev/null 2>&1 && tput setaf 1 > /dev/null 2>&1

您根本没有使用继承的 stdout/stderr 流。首先,stdout 被重定向到/dev/null,然后 stderr 也被重定向。所以特定exec行不会影响这些命令。

相关内容