在Linux系统的shell中执行命令时,有三种标准文件可由内核自动打开,以读取输入、发送输出和输出错误消息(如图-1示)。这些功能称为标准I/O,包括:
▪ 标准输入(stdin)—— 文件描述符为0,标准输入默认设置为键盘; |
▪ 标准输出(stdout)—— 文件描述符为1,标准输出用于命令执行时的正常输出,默认设置为终端屏幕; |
▪ 标准错误(stderr)—— 文件描述符为2,标准错误用于命令执行时的错误信息,默认设置为终端屏幕; |
在Linux进程中,每个输入源和每个输出目标都由一个唯一的数字标识,这个数字就称为文件描述符。
图-1 命令执行的数据输入输出过程
1. 重定向
通过使用重定向功能,可将与命令的标准文件相关的默认设备更改为其他文件,使用这些功能的结果即是标准输入、标准输出和标准错误重定向。
1.1 标准输入重定向
标准输入重定向是使用文件替代标准输入默认设备(键盘输入),即命令是从文件中获取输入而不是从键盘。标准输入重定向的使用语法如下:
command 0< inputfile
其中inputfile是文件的名称,使用标准输入重定向也可以省略0,写成:
command < inputfile
1.2 标准输出重定向
标准输出重定向是将新关联的文件替代标准输出默认设备(终端屏幕),即允许命令将结果输出到新关联的文件中,而不是输出到终端屏幕上。标准输出重定向的使用语法如下:
command 1> outputfile
其中outputfile是文件的名称,使用标准输出重定向也可以省略1,写成:
command > outputfile
使用标准输出重定向时,如果指定的重定向文件已存在,那么该文件的内容将会被命令的正常输出所覆盖。我们可以通过设置shell的选项,当使用>重定向输出时,不要替换已存在的文件。对于bash来说,需要设置shell选项noclobber。
set –o noclobber
即使设置了shell选项noclobber,我们也可以通过>|操作符来强制覆盖文件,忽略shell选项noclobber。
command >| outputfile
如果我们希望将命令的正常输出信息重定向到一个已存在的文件末尾时,可以使用>>操作符。
command >> outputfile
command 1>> outputfile
1.3 标准错误重定向
标准错误重定向是将新关联的文件替代标准错误默认设备(终端屏幕),即允许命令将错误结果输出到新关联的文件,而不是输出到终端屏幕上。标准错误重定向的使用语法如下:
command 2> errorfile
如果我们希望将命令的错误输出信息重定向到一个已存在的文件末尾时,可以使用2>>操作符。
command 2>> errorfile
1.4 重定向的特殊使用
如果我们想要将命令的正确输出结果和错误输出结果重定向到不同文件中,可以使用如下语法:
command> ouputfile 2> errorfile
如果我们想要将命令的正确输出结果和错误输出结果重定向到同一个文件中,可以使用如下语法:
command >file 2>&1
2>&1的所用就是将标准错误重定向到标准输出。对于bash的用户来说,也可以使用&>或>&操作符来同时重定向标准输出和标准错误到同一文件中
command &> file
command >&file
如果我们想要将命令的正确输出结果和错误输出结果重定向到一个已存在文件的末尾中,可以使用如下语法:
command >>file 2>&1
在执行一个命令时,如果我们知道会有错误的结果输出,而又不想让这些错误结果输出到屏幕上,并且不想保存这些错误输出结果,这时我们可以把错误输出结果扔到/dev/null中。
command 2> /dev/null
/dev/null是一个特殊的文件,俗称位桶(bitbucket),它会丢失所有发送给它的任何东西。
2. 管道线与管道线分流
在Linux系统中,shell允许创建一序列命令,在该序列命令中(如图-2示),一个命令标准输出可以自动的发送给下一个命令的标准输入。连接在两个命令之间的就是管道(pipe),命令序列称为管道线(pipeline)。
图-2管道命令的处理示意图
管道的操作符为[|],可以实现将某个命令的标准输出和某个命令的标准输入相连的功能。管道操作符的语法如下:
command1 |command2 |command3| …… | commandN
2.1 管道线分流:tee
如果我们希望将命令的标准输出同时发送到两个地方,例如,一个输出保存到文件中,同时还发送给另外一个命令。可以使用tee命令实现这一目的,tee命令的作用就是从标准输入读取数据,并向标准输出和一个文件各发送一份数据。tee命令的使用语法如下:
tee [-ai] file...
tee命令的参数说明:
▪ -a | 追加到已存在文件的后面,而不是覆盖 |
▪ -i | 忽略中断信号 |
tee命令的标准输入是另一个命令的标准输出,而不是键盘,所以tee命令的使用模式如下:
command | tee file