我试图理解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
答案 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的错误消息。