【发布时间】:2021-10-10 03:38:39
【问题描述】:
我目前正在学习 Shell 表示法,我遇到了以下命令:
./a.out < infile 2>&1 > outfile
infile 和 outfile 是文件名。
我认为这个命令的作用是
- 将“标准输入”设置为“infile”
- 将“标准错误”重定向到“标准输出”
- 将“标准输出”设置为“outfile”
我的解释正确吗?如果不是,我应该如何理解这个命令?
【问题讨论】:
标签: shell io-redirection
我目前正在学习 Shell 表示法,我遇到了以下命令:
./a.out < infile 2>&1 > outfile
infile 和 outfile 是文件名。
我认为这个命令的作用是
我的解释正确吗?如果不是,我应该如何理解这个命令?
【问题讨论】:
标签: shell io-redirection
TL;DR:2>&1 在最后。
你的解释是正确的。但是命令有问题。让我们看看您列出的步骤,并列出所有血淋淋的细节。
< infile 从infile 重定向标准输入。这意味着当./a.out 从标准输入读取时,它将从文件中读取。
2>&1 将 stderr 重定向到 stdout 当前指向的任何位置。通常 stdout 将是终端,因此这使得 stderr 也写入终端。但是 stderr 通常默认写入终端,所以这可能是一个错误。我将在下面进一步解释。
> outfile 将标准输出重定向到outfile。当./a.out 写入标准输出时,它将写入文件。
最终结果是程序从infile 读取,将其标准输出写入outfile,并将错误写入终端。
如果您仔细按照这些步骤进行操作,您可能会对第 2 步感到困惑,因为 2>&1 最终将 stderr 重定向到它已经指向的位置。写这篇文章的人很可能混淆了重定向的顺序并打算写这个:
# Fixed redirection order.
./a.out < infile > outfile 2>&1
这里第 2 步和第 3 步互换了。
> outfile 将标准输出重定向到outfile。当./a.out 写入标准输出时,它将写入文件。 这里没有变化。
2>&1 将 stderr 重定向到 stdout 当前指向的位置,outfile。现在所有输出都重定向到outfile。
在这个版本中,stdout 和 stderr 都被重定向到outfile。一切都被捕获,包括常规输出和错误。这可能是本意,同意吗?
如果您之前没有看到这个,它可能会向后看。为什么最后是2>&1?关键的见解是,当我们说2>&1“将stderr 重定向到stdout”时,我们并不是说stderr 现在和永远都指向stdout。我们的意思是 stderr 将指向 stdout 当前 指向的任何地方。如果我们将 stderr 重定向到 stdout,然后将 stdout 重定向到其他位置,则 stderr 会继续指向之前的位置。
这就是2>&1 出现在最后的原因。
【讨论】: