我正在编写 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
行不会影响这些命令。