【发布时间】:2012-02-11 21:08:08
【问题描述】:
我看到了一个 bash 脚本,它的函数中有 exec 1>&2 命令。比如:
function example()
{
exec 1>&2
cat <<EOT
Script requires at least one parameter.
EOT
exit 1
}
据我了解,exec 1>&2 意味着从这一点开始的所有内容都将被定向到 stderr。这是 exec 的某种固定行为,我们需要牢记在心,或者这背后是否有一些很好的解释?我的意思是,据我所知,Bash 脚本中的 exec 只是调用一个 command,它采用与 Bash 脚本相同的 PID,并且一旦 command 完成,PID被杀死。 1>&2 不是命令。有人可以解释exec 1>&2 命令背后的细节(尤其是why 问题)吗?
【问题讨论】:
-
在这种情况下,代码是一种冗长的写法:
echo "Script requires at least one parameter" 1>&2。此外,错误消息没有帮助;您必须猜测该参数是什么。更好的消息是:echo "Usage: $(basename $0 .sh) filename [...]" 1>&2"告诉您(提醒您)正确的用法和要提供的内容。并且使用 4 行来做一个工作有点 OTT。如果“回显”有很多行,那么重定向更有意义,但仍然可以使用cat 1>&2 <<EOT后跟“此处文档”来完成。 -
@JonathanLeffler:我同意。将
exec 1>&2放在执行其他操作的大括号包裹函数的开头是一种邪恶,因为该副作用在函数返回后仍然存在。 (诚然,这个函数调用exit 1,但这个成语甚至不应该存在。) -
@ruakh:一般来说,在函数内部做这件事不是很好——但如果这是函数的预期行为,那可能是正确的。成语本身很有用,使用得当。这是“正确使用”的一个非常边缘的实例(例如,我认为它位于边界的错误一侧,进入“不当使用”领域)。
-
@JonathanLeffler:是的,我想我们同意了。如果函数的预期行为是重定向标准输出,那是一回事;但如果它做其他事情,那么它不应该只是顺便重定向标准输出。