理解bash“exec 1>& 2”命令

时间:2012-01-17 00:32:42

标签: bash exec

我看到一个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命令背后的细节(特别是为什么问题?)

3 个答案:

答案 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可以找到您感兴趣的进一步阅读。你可以做很多简洁的小重定向技巧。