【问题标题】:understanding bash "exec 1>&2" command理解 bash "exec 1>&2" 命令
【发布时间】:2012-02-11 21:08:08
【问题描述】:

我看到了一个 bash 脚本,它的函数中有 exec 1>&2 命令。比如:

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

据我了解,exec 1&gt;&amp;2 意味着从这一点开始的所有内容都将被定向到 stderr。这是 exec 的某种固定行为,我们需要牢记在心,或者这背后是否有一些很好的解释?我的意思是,据我所知,Bash 脚本中的 exec 只是调用一个 command,它采用与 Bash 脚本相同的 PID,并且一旦 command 完成,PID被杀死。 1>&2 不是命令。有人可以解释exec 1&gt;&amp;2 命令背后的细节(尤其是why 问题)吗?

【问题讨论】:

  • 在这种情况下,代码是一种冗长的写法:echo "Script requires at least one parameter" 1&gt;&amp;2。此外,错误消息没有帮助;您必须猜测该参数是什么。更好的消息是:echo "Usage: $(basename $0 .sh) filename [...]" 1&gt;&amp;2" 告诉您(提醒您)正确的用法和要提供的内容。并且使用 4 行来做一个工作有点 OTT。如果“回显”有很多行,那么重定向更有意义,但仍然可以使用cat 1&gt;&amp;2 &lt;&lt;EOT 后跟“此处文档”来完成。
  • @JonathanLeffler:我同意。将exec 1&gt;&amp;2 放在执行其他操作的大括号包裹函数的开头是一种邪恶,因为该副作用在函数返回后仍然存在。 (诚​​然,这个函数调用exit 1,但这个成语甚至不应该存在。)
  • @ruakh:一般来说,在函数内部做这件事不是很好——但如果这是函数的预期行为,那可能是正确的。成语本身很有用,使用得当。这是“正确使用”的一个非常边缘的实例(例如,我认为它位于边界的错误一侧,进入“不当使用”领域)。
  • @JonathanLeffler:是的,我想我们同意了。如果函数的预期行为是重定向标准输出,那是一回事;但如果它做其他事情,那么它不应该只是顺便重定向标准输出。

标签: bash exec


【解决方案1】:

原文来源:http://tldp.org/LDP/abs/html/x17784.html

一个 exec

同样,exec >filename 命令将标准输出重定向到指定文件。这会将通常会发送到标准输出的所有命令输出发送到该文件。

注意 exec N > 文件名会影响整个脚本或当前 shell。从那时起,脚本或 shell 的 PID 中的重定向已更改。但是,N > filename 只影响新分叉的进程,而不影响整个脚本或 shell。

可以在@http://tldp.org/LDP/abs/html/io-redirection.html 找到您感兴趣的进一步阅读。您可以做很多巧妙的重定向小技巧。

【讨论】:

    【解决方案2】:

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

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

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

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

    exec >tmp.txt
    exec >>stdout.log 2>>stderr.log
    exec 2>&1
    

    (但它适用于管道。)

    【讨论】:

      【解决方案3】:

      为什么是历史的偶然,没有很大的原因。

      重定向运算符适用于任何程序(例如,cat),并且添加了&gt;&amp; 表单来表达“从 2 复制文件描述符 1”,因为它很有用。使用&gt;&amp; 语法可能是因为它们的特殊字符用完了,鉴于&amp;&gt; 的基本含义,&gt;&amp; 是无稽之谈(但不要引用我的话)。这一切都可以追溯到 1977 年左右的早期 Bourne shell。

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

      由于 bash 尝试尽可能地遵守 Bourne shell 约定,因此您会得到这些古物,正如您所怀疑的那样,您只需要记住,特别是如果您想给其他适当性别的成员留下深刻印象(即“小鸡挖一个知道他的 i/o 重定向奥秘的人”)。

      【讨论】:

      • “小鸡挖……”?乐观主义者!
      • +1 最后一句。显然,没有什么比 bash 知识的深度更有吸引力了。
      猜你喜欢
      • 2023-03-03
      • 2013-12-07
      • 2018-04-09
      • 1970-01-01
      • 2018-10-17
      • 1970-01-01
      • 1970-01-01
      • 2021-03-22
      • 1970-01-01
      相关资源
      最近更新 更多