【问题标题】:What is the meaning of this shell command?这个shell命令是什么意思?
【发布时间】:2021-10-10 03:38:39
【问题描述】:

我目前正在学习 Shell 表示法,我遇到了以下命令:

./a.out < infile 2>&1 > outfile

infile 和 outfile 是文件名。

我认为这个命令的作用是

  1. 将“标准输入”设置为“infile”
  2. 将“标准错误”重定向到“标准输出”
  3. 将“标准输出”设置为“outfile”

我的解释正确吗?如果不是,我应该如何理解这个命令?

【问题讨论】:

    标签: shell io-redirection


    【解决方案1】:

    TL;DR:2&gt;&amp;1 在最后

    你的解释是正确的。但是命令有问题。让我们看看您列出的步骤,并列出所有血淋淋的细节。

    1. &lt; infileinfile 重定向标准输入。这意味着当./a.out 从标准输入读取时,它将从文件中读取。

    2. 2&gt;&amp;1 将 stderr 重定向到 stdout 当前指向的任何位置。通常 stdout 将是终端,因此这使得 stderr 也写入终端。但是 stderr 通常默认写入终端,所以这可能是一个错误。我将在下面进一步解释。

    3. &gt; outfile 将标准输出重定向到outfile。当./a.out 写入标准输出时,它将写入文件。

    最终结果是程序从infile 读取,将其标准输出写入outfile,并将错误写入终端。

    如果您仔细按照这些步骤进行操作,您可能会对第 2 步感到困惑,因为 2&gt;&amp;1 最终将 stderr 重定向到它已经指向的位置。写这篇文章的人很可能混淆了重定向的顺序并打算写这个:

    # Fixed redirection order.
    ./a.out < infile > outfile 2>&1
    

    这里第 2 步和第 3 步互换了。

    1. &gt; outfile 将标准输出重定向到outfile。当./a.out 写入标准输出时,它将写入文件。 这里没有变化。

    2. 2&gt;&amp;1 将 stderr 重定向到 stdout 当前指向的位置,outfile。现在所有输出都重定向到outfile

    在这个版本中,stdout 和 stderr 都被重定向到outfile。一切都被捕获,包括常规输出和错误。这可能是本意,同意吗?

    如果您之前没有看到这个,它可能会向后看。为什么最后是2&gt;&amp;1?关键的见解是,当我们说2&gt;&amp;1“将stderr 重定向到stdout”时,我们并不是说std​​err 现在和永远都指向stdout。我们的意思是 stderr 将指向 stdout 当前 指向的任何地方。如果我们将 stderr 重定向到 stdout,然后将 stdout 重定向到其他位置,则 stderr 会继续指向之前的位置。

    这就是2&gt;&amp;1 出现在最后的原因。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-06
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多