Linux之标准IO、重定向与管道符
标准IO
在Unix中,每个基于文本的程序都应该能够从任何源接受输入,并向任何目标写入输出。这个概念/思想称之为标准IO
这意味着我们的程序既可以从键盘读取输入,也可以从文件读取输入。同时,也既可以向屏幕写入输出,也可以文件写入输出。
为此,Unix中设计了一种读取数据的通用方法:标准输入。还设计了两种写入数据的通用方法:标准输出和标准错误。
输出重定向
登陆时,shell会将标准输入设置为键盘,标准输出和标准错误设置为屏幕,从而与用户交互。
如果你需要将标准输出写入到文件中,则可以使用>
,例如
date > temp
此时date
的输出会写入到temp中。如果temp不存在,则会创建,如果已存在,则会覆盖。
如果你不想覆盖已有文件,而是写入到文件内容末尾,则使用>>
,例如
date >> temp
如果文件不存在依旧会创建文件
如果要防止输入错误导致覆盖文件,可以开启noclobber
选项,开启后,使用>
将会提示无法覆盖,使用>|
可以忽略noclobber
,开启命令如下
set -o noclobber
重定向标准错误输出需要使用2>
,2表示标准错误,1表示标准输出,但1通常省略,2不可省略。
若需要将标准输出和标准错误都重定向到同一个文件,则可以使用&>
。
如果你希望抛弃输出,则可以将输出重定向到/dev/null
(位桶)
输入重定向
使用<
可以使命令从文件中读取输入,例如排序命令sort
sort < sort_input
如果你希望同时重定向输入输出,则命令如下
sort < sort_input > sort_output
管道符
管道符|
可以将上一个程序的标准输出作为下一个程序的标准输入。例如,用分页查看最后登录信息可以使用如下命令
last | less
如果希望将标准输出和错误输出都传给下一个程序,则命令如下
ls -l file1 file2 2>&1 | less
其中,2>&1
表示将标准错误输出到和标准输出同一个地方,而标准输出已经作为了less
的标准输入,所以标准错误也会作为less
标准输入。
分流tee
命令tee
会将标准输入直接作为标准输出,同时可以指定文件,将输入保存为文件,语法为
tee [-a] [file…]
例如,将打印登陆信息的同时,将登陆信息保存到temp中,可以使用如下命令
last | tee temp
若还想使用分页查看登陆信息,则可以将输出传给less
last | tee temp | less
使用tee
如果文件不存在,会创建文件,否则,会覆盖文件。加上选项-a
则可以添加到文件末尾。