理解bash"exec 1>&2"命令

Mar*_*tin 13 bash exec

我看到一个bash脚本exec 1>&2在一个函数中有命令.就像是:

function example()
{
    exec 1>&2
    cat <<EOT
Script requires at least one parameter.
EOT
    exit 1
} 
Run Code Online (Sandbox Code Playgroud)

据我所知,exec 1>&2意味着从这一点开始的一切都将被引导到stderr.这是某种形式的固定行为的高管需要知道的心脏或者是有这背后的一些很好的解释?我的意思是,据我所知,执行 Bash脚本只是调用一个命令采用与Bash脚本相同的PID,一旦命令完成,PID就会被终止.1>&2不是命令.有人可以解释命令背后的细节(尤其是问题原因)exec 1>&2吗?

rua*_*akh 20

exec是一个内置的Bash函数,因此它可以具有外部程序所不具备的特殊行为.特别是,它具有以下特殊行为:

如果未指定COMMAND,则任何重定向都会在当前shell中生效.

(这是根据给出的消息引用的help exec.)

这适用于任何类型的重定向; 你也可以写下这些中的任何一个:

exec >tmp.txt
exec >>stdout.log 2>>stderr.log
exec 2>&1
Run Code Online (Sandbox Code Playgroud)

(它不是,但是,适用于管道.)


msw*_*msw 12

为什么是历史事故,没有很好的理由.

重定向操作符应用于任何程序(例如,cat),>&并添加表单以表示"重复文件描述符1从2",因为它很有用.该>&语法可能被用来因为他们跑出来的特殊字符,>&是无稽之谈给予的基本内涵&>(但不可以引用我这句话).这些东西都可以追溯到1977年左右早期的Bourne shell.

为什么exec加上重定向来改变当前shell的输入和输出?可能是因为null命令已经有了一个意思,> path它具有相同的效果,cat /dev/null > path但更容易打字,当你的电传打字机每秒最多运行10个字符时,这就很重要了.因此,exec内置函数被重载:没有参数,它将重定向操作应用于自身.

由于bash试图尽可能地遵守Bourne shell约定,你会得到这些古物,正如你所怀疑的那样,你必须要特别记住,如果你试图给其他成员留下足够的印象(即"小鸡挖一个人知道他的i/o重定向arcana").

  • “小鸡挖……”?乐观! (2认同)
  • +1最后一句话。显然,诱饵的深度远不止于此。 (2认同)