电脑输入输出怎么样分开(重定向输入和输出)
shell控制它运行的命令的输入和输出,管道就是其中一个例子,它将一个命令的stdout定向到另一个命令的stdin。管道语法(|)是shell的一个功能。
另一个shell功能是将标准输出重定向到文件。例如,下面grep命令的输出默认写到stdout:
$grepPerlanimals.txtalpacaIntermediatePerl2012Schwartz,Randal
可以改用称为输出重定向的shell功能将该输出发送到文件,添加符号>后跟文件名即可:
$grepPerlanimals.txt>outfile$catoutfilealpacaIntermediatePerl2012Schwartz,Randal
如果输出文件不存在,则会创建该文件。如果文件已存在,重定向将覆盖文件内容。如果希望追加到输出文件而不是覆盖,改用符号>>:
$grepPerlanimals.txt>outfile$echoTherewasjustonematch>>outfile$catoutfilealpacaIntermediatePerl2012Schwartz,RandalTherewasjustonematch
类似的,输入也支持重定向,它可以将stdin重定向到来自文件而不是键盘。使用符号< 后跟文件名重定向 stdin。许多接受文件名作为参数并从这些文件读取的 Linux 命令,在没有参数的情况下运行时也会从 stdin 读取。例如,用于计算文件中的行、单词和字符的 wc:
$wcanimals.txt751325animals.txt$wc< animals.txt7 51 325
了解这两个wc命令在行为上有何不同非常重要:
·在第一个命令中,wc接收文件名animals.txt作为参数,因此wc知道该文件存在,wc打开磁盘上的文件并读取其内容。
·在第二个命令中,wc被调用时没有参数,因此它从stdin(通常是键盘)读取。然而,shell偷偷地将stdin重定向到来自animals.txt文件的内容。wc不知道animals.txt文件存在。
shell可以在同一命令中重定向输入和输出:
$wc< animals.txt >count$catcount751325
甚至可以同时使用管道。在这里,grep从重定向的stdin读取并将结果通过管道传输到wc,wc写入重定向的stdout,生成文件计数:
$grepPerl< animals.txt | wc >count$catcount1647标准错误(stderr)和重定向
在日常Linux使用中,你可能会注意到某些输出(例如某些错误消息)无法通过>重定向。例如要求cp复制一个不存在的文件,它会产生以下错误消息:
$cpnonexistent.txtfile.txtcp:cannotstat'nonexistent.txt':Nosuchfileordirectory
如果将该cp命令的输出重定向到文件,错误消息仍会显示在屏幕上:
$cpnonexistent.txtfile.txt>errorscp:cannotstat'nonexistent.txt':Nosuchfileordirectory
并且errors文件内容为空。
为什么会这样?Linux命令可以生成多个输出流。除了stdout之外,还有stderr(标准错误),这是传统上为错误消息保留的第二个输出流。stderr和stdout在显示屏上看起来相同,但在内部它们是分开的。可以使用符号2>后跟文件名重定向stderr:
$cpnonexistent.txtfile.txt2>errors$caterrorscp:cannotstat'nonexistent.txt':Nosuchfileordirectory
将stderr追加到一个文件中,使用2>>:
$cpnonexistent.txtfile.txt2>errors$cpanother.txtfile.txt2>>errors$caterrorscp:cannotstat'nonexistent.txt':Nosuchfileordirectorycp:cannotstat'another.txt':Nosuchfileordirectory
要将stdout和stderr重定向到同一个文件,使用&>:
$echoThisfileexists>goodfile.txt$catgoodfile.txtnonexistent.txt&>all.output$catall.outputThisfileexistscat:nonexistent.txt:Nosuchfileordirectory