我看到一个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 只调用命令获取与Bash脚本相同的PID,并且命令完成后,PID被杀死了。 1&gt;&amp; 2 不是命令。有人可以解释exec 1>&2
命令背后的细节(特别是为什么问题?)
答案 0 :(得分:17)
exec
是一个内置的Bash函数,因此它可能具有外部程序无法拥有的特殊行为。特别是,它具有以下特殊行为:
如果未指定COMMAND,则任何重定向都会在当前shell中生效。
(引自help exec
给出的消息。)
这适用于任何类型的重定向;你也可以写下这些中的任何一个:
exec >tmp.txt
exec >>stdout.log 2>>stderr.log
exec 2>&1
(但不,适用于管道。)
答案 1 :(得分:10)
为什么是历史事故,没有很好的理由。
重定向运算符应用于任何程序(例如,cat
),并添加>&
表单以表示“重复文件描述符1从2”,因为它很有用。可能使用了>&
语法,因为它们的特殊字符用尽了,>&
根据&
和>
的基本含义是无意义的(但不引用我的话)那)。这些东西都可追溯到1977年左右的早期Bourne shell。
为什么exec
加上重定向来改变当前shell的输入和输出?可能是因为null命令> path
已经具有与cat /dev/null > path
具有相同效果但更容易键入的含义,并且当您的电传打字数最多以每秒10个字符运行时,这很重要。因此,exec
内置函数被重载:没有参数,它将重定向操作应用于自身。
由于bash试图尽可能地遵守Bourne shell惯例,你会得到这些古物,正如你所怀疑的那样,你必须要特别记住,如果你试图给其他成员留下深刻的印象(即“小鸡挖掘”)一个知道他的i / o重定向奥秘的人。)。
答案 2 :(得分:2)
原始来源:http://tldp.org/LDP/abs/html/x17784.html
exec&lt; filename命令将stdin重定向到文件。从那时起,所有stdin都来自该文件,而不是它的正常来源(通常是键盘输入)。这提供了一种逐行读取文件的方法,并可能使用sed和/或awk解析每行输入。
类似地,exec&gt; filename命令将stdout重定向到指定的文件。这会将通常发送到stdout的所有命令输出发送到该文件。
注意exec N&gt; filename影响整个脚本或当前shell。从那一点开始,脚本或shell的PID中的重定向已更改。但是,N> filename只影响新分叉的进程,而不影响整个脚本或shell。
@ http://tldp.org/LDP/abs/html/io-redirection.html可以找到您感兴趣的进一步阅读。你可以做很多简洁的小重定向技巧。