我看到一个bash脚本,它在函数中包含exec 1>&2命令。类似于:
function example()
{
exec 1>&2
cat <<EOT
Script requires at least one parameter.
EOT
exit 1
} 据我所知,exec 1>&2意味着从这一点开始的一切都将指向stderr。这是一个人需要记住的某种固定的行为,还是背后有什么好的解释?我的意思是,正如我所理解的那样,Bash中的exec只是调用一个命令,该命令与Bash脚本具有相同的PID,一旦命令完成,PID就会被杀死。1>&2不是命令。有人能解释一下命令背后的细节(特别是为什么是exec 1>&2问题)吗?
发布于 2012-01-17 00:40:15
exec是一个内置的Bash函数,因此它可以具有外部程序无法拥有的特殊行为。特别是,它有一种特殊的行为:
如果没有指定
命令,则任何重定向都会在当前shell中生效。
(这是引用help exec给出的消息。)
这适用于任何类型的重定向;您还可以编写,例如,其中任何一个:
exec >tmp.txt
exec >>stdout.log 2>>stderr.log
exec 2>&1(但不适用于喉管。)
发布于 2012-01-17 00:51:24
为什么是历史上的意外,没有很大的理由。
重定向操作符被应用于任何程序(例如,cat),并且添加了>&表单来表示“重复的文件描述符1从2”,因为它很有用。>&语法的使用可能是因为它们没有特殊字符,而考虑到&和>的基本含义,>&是一派胡言(但不要引用我的话)。这些东西都可以追溯到1977年早期的伯恩贝壳时代。
为什么exec加上重定向来改变当前shell的输入和输出?可能是因为null命令> path已经有了意义,它与cat /dev/null > path具有相同的效果,但更容易键入,而且当您的电传打字机以每秒10个字符运行时,这一点很重要。因此,exec内置程序就被重载了:没有参数,它将重定向操作应用到自己身上。
由于bash试图尽可能地遵守伯恩贝壳的惯例,你得到了这些古董,正如你所怀疑的那样,你只需要记住,尤其是当你试图给其他合适性别的成员留下深刻印象的时候(也就是说,“小鸡挖的是一个知道他的i/o重定向奥秘的家伙”)。
发布于 2012-01-17 00:40:13
原始资料来源:http://tldp.org/LDP/abs/html/x17784.html
exec
类似地,exec >filename命令将stdout重定向到指定的文件。这将发送通常会转到stdout到该文件的所有命令输出。
注意,exec N> filename会影响整个脚本或当前shell。从这一点开始,脚本或shell的PID中的重定向发生了变化。但是,N>文件名只影响新分叉的进程,而不是整个脚本或shell。
进一步阅读将感兴趣的你可以找到@ http://tldp.org/LDP/abs/html/io-redirection.html。有许多整洁的小重定向技巧,你可以做。
https://stackoverflow.com/questions/8888251
复制相似问题