重定向 apt-get 输出

Chr*_*her 2 command-line apt patch redirect

所以 apt-get 有一些输出,我似乎无法重定向到其他任何地方。这是我所看到的示例:

sudo apt-get -qq -y --force-yes install cowsay 2>&1 > /tmp/tmp.txt
Run Code Online (Sandbox Code Playgroud)

这是我在 16.04 上运行的示例命令。我在--force-yes这里包括模拟一个适当的警告以备将来使用。现在我希望这个命令将所有内容重定向到/tmp/tmp.txt; 大部分代码都是这样做的。但是,当我运行它时,我得到以下信息:

$ sudo apt-get -qq -y --force-yes remove cowsay 2>&1 > /tmp/tmp.txt
W: --force-yes is deprecated, use one of the options starting with --allow instead.
Run Code Online (Sandbox Code Playgroud)

我如何也收到重定向到我的文件的警告?

Byt*_*der 9

您在错误的位置设置了流重定向命令。重定向得到从右到左解析,因此,你需要先写> /tmp/tmp.txt,然后2>&1。在您编写它时,它首先将 STDOUT 重定向到文件,然后将 STDERR 重定向到 STDOUT。

这是正确的命令:

sudo apt-get -qq -y --force-yes remove cowsay > /tmp/tmp.txt 2>&1
Run Code Online (Sandbox Code Playgroud)

但是有一个更简单的选择!您不一定需要将 STDERR 重定向到 STDOUT 才能将两者写入文件,还有一个运算符可以直接将 STDOUT 和 STDERR 重定向到文件:&>

sudo apt-get -qq -y --force-yes remove cowsay &> /tmp/tmp.txt
Run Code Online (Sandbox Code Playgroud)

解释和更多信息:

  • > filename 将 STDOUT(流 1)重定向到 filename
  • 2> filename 将 STDERR(流 2)重定向到 filename
  • &> filename 将 STDOUT 和 STDERR 重定向到 filename

同样,如果要将输出通过管道传输到第二个命令:

  • | 将 STDOUT(流 1)重定向到第二个命令的 STDIN
  • 2| filename 将 STDERR(流 2)重定向到第二个命令的 STDIN
  • &| filename 将 STDOUT 和 STDERR 重定向到第二个命令的 STDIN