标准输入、标准输出和标准错误
一个程序的的输入可以来自于键盘,也可以来自于文件或者其他设备;同样的,一个程序也可以将输出显示在屏幕或者保存到文件中。这就涉及到标准输入、标准输出和标准错误。
程序的输入是标准输入,默认是键盘,用户可以将其指定为文件或其他设备。
程序的输出有两种,即标准输出和标准错误,其中标准输出是程序的正常输出、标准错误是程序的错误输出。二者默认都被指定为屏幕,用户可以将其指定为文件或其他设备。
下面的程序从键盘读取输入,将结果显示在屏幕上,即标准输入、标准输出和标准错误都采用默认的设置:
$ ls ~
hello.txt homework name source.list.bk
重定向
用户可以对输入和输出进行重定向,即指定标准输入、标准输出和标准错误。
标准输入使用<
进行指定,下面的命令将input
文件作为sort
命令的输入,即将sort
命令的标准输入重定向为input
文件:
$ cat input
zhao
qian
sun
li
zhou
wu
zheng
wang
$ sort < input
li
qian
sun
wang
wu
zhao
zheng
zhou
本例中input
文件作为sort
命令的标准输入。
使用>
重定向标准输出:
$ ls ~ > output
$ cat output
hello.txt
homework
input
name
output
source.list.bk
如上所示,ls ~
的标准输出被重定向为output
,因此其输出被写入output
文件。
需要注意的是,如果output
不存在,将自动创建output
文件;如果output
存在,那么将清空output
的内容,并写入新的内容。
如果只是想在输出文件的已有内容的末尾追加,可以使用>>
:
$ date >> output
$ cat output
hello.txt
homework
input
name
output
source.list.bk
Sat Jun 30 18:18:53 CST 2018
下面的命令将标准输入重定向为input
,将标准输出重定向为output
:
$ sort < input > output # 覆盖output内容
$ sort < input >> output # 在output末尾追加内容
文件描述符
每个输入源和输出地都有一个描述符,标准输入的描述符为0,标准输出的描述符为1,标准错误的描述符为2。
使用0<
重定向标准输入,事实上,由于程序的默认重定向输入即为标准输入,所以下面的两条命令是等价的:
$ sort < input
$ sort 0< input
同样的,程序的默认重定向输出为标准输出,所以下面的两条命令也是等价的:
$ ls > output
$ ls 1> output
下面的命令将标准输入重定向为input
文件,标准输出重定向为output
文件(追加),将标准错误重定向为error
文件:
$ sort < input 1>> output 2> error
组合标准输出和标准错误
下面的命令将标准输出重定向为output
文件,标准错误仍然显示在屏幕上:
$ sort < input > output
下面的命令将标准输出重定向为output
文件,将标准错误重定向为error
文件:
$ sort < input > output 2> error
下面的命令将标准输出重定向为output
文件,使用2>&1
将标准错误重定向为标准输出:
$ sort < input > output 2>&1
上面的例子中,标准输出和标准错误都会被重定向为output
文件。
注意,下面的命令将导致标准输出和标准错误的相互覆盖,因此不可使用:
$ sort < input > output 2> output