首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解bash "exec 1>&2“命令

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

Stack Overflow用户
提问于 2012-01-17 00:32:41
回答 3查看 29.8K关注 0票数 14

我看到一个bash脚本,它在函数中包含exec 1>&2命令。类似于:

代码语言:javascript
复制
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问题)吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-01-17 00:40:15

exec是一个内置的Bash函数,因此它可以具有外部程序无法拥有的特殊行为。特别是,它有一种特殊的行为:

如果没有指定

命令,则任何重定向都会在当前shell中生效。

(这是引用help exec给出的消息。)

这适用于任何类型的重定向;您还可以编写,例如,其中任何一个:

代码语言:javascript
复制
exec >tmp.txt
exec >>stdout.log 2>>stderr.log
exec 2>&1

(但不适用于喉管。)

票数 24
EN

Stack Overflow用户

发布于 2012-01-17 00:51:24

为什么是历史上的意外,没有很大的理由。

重定向操作符被应用于任何程序(例如,cat),并且添加了>&表单来表示“重复的文件描述符1从2”,因为它很有用。>&语法的使用可能是因为它们没有特殊字符,而考虑到&>的基本含义,>&是一派胡言(但不要引用我的话)。这些东西都可以追溯到1977年早期的伯恩贝壳时代。

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

由于bash试图尽可能地遵守伯恩贝壳的惯例,你得到了这些古董,正如你所怀疑的那样,你只需要记住,尤其是当你试图给其他合适性别的成员留下深刻印象的时候(也就是说,“小鸡挖的是一个知道他的i/o重定向奥秘的家伙”)。

票数 17
EN

Stack Overflow用户

发布于 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。有许多整洁的小重定向技巧,你可以做。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8888251

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档