linux shell标准输出和错误输出重定向在组合时如何工作?

时间:2017-06-24 22:59:36

标签: linux shell redirect

我试图理解linux shell脚本(bourne,bash)中标准和错误重定向的优点。

示例1:

cat file1  > output.txt

cat file1  1> output.txt

这会将file1的内容重定向到output.txt。按预期工作。

示例2:

kat file1  2> output.txt

kat命令不存在,因此错误被重定向到output.txt。按预期工作。

示例3:

cat file1  2>&1 output.txt

因为cat是一个有效的命令并且file1存在,所以我希望这里的行为与示例1相同。相反,我似乎将这两个文件的内容都显示在屏幕上。

示例4:

kat file1  2>&1 output.txt 

由于kat不存在,我希望与示例2的行为相同。相反,我得到屏幕错误(“-bash:kat:command not found”)

如许多在线手册中所述,例如: https://www.gnu.org/software/bash/manual/html_node/Redirections.html

2 个答案:

答案 0 :(得分:3)

问题是2>&1只告诉shell将文件描述符2(标准错误)重定向到文件描述符1(标准输出)。它实际上并没有对标准输出进行任何重定向。

为此你必须明确地像

那样做
cat file1 > output.txt 2>&1

请注意,您必须执行描述符重定向 last (在标准输出重定向之后),否则它将无效。

这一点在the Bash manual page中有所解释(参见the section about redirection)。

答案 1 :(得分:1)

cat file1 2>&1 output.txt

shell将设置重定向(stderr到stdout)。在那之后,你将把“left”作为shell执行的命令:

cat file1 output.txt

这就是你看到这两个内容的原因。

有关

kat file1 2>&1 output.txt

它是相同的,因为只有

kat file1 output.txt
shell在设置要执行的命令的描述符之后留下

。而这无法找到=>来自shell的错误消息。