在介绍输入输出重定向前,我们需要知道什么是标准输入和输出
1.标准输入输出
设备 | 设备文件名 | 文件描述符 | 类型 |
---|---|---|---|
键盘 | /dev/stdin | 0 | 标准输入 |
显示器 | /dev/sdtout | 1 | 标准输出 |
显示器 | /dev/sdterr | 2 | 标准错误输出 |
下面我们来看一下什么是输出重定向
从字面意义上我们可以这样理解:输出本来是当我进行命令后,输出到屏幕上,现在我不让他输出到屏幕,改变他的输出方向,把他输出到文件当中,就叫输出重定向。
2.输出重定向
类型 | 符号 | 作用 |
---|---|---|
标准输出重定向 | 命令 > 文件 | 以覆盖的方式,把命令的正确输出输出到指定的文件或设备当中。 |
命令 >> 文件 | 以追加的方式,把命令的 正确输出输出到指定的文件或设备当中。 | |
标准错误输出重定向 | 错误命令 2> 文件 | 以覆盖的方式,把命令的 错误输出输出到指定的文件或设备当中。 |
错误命令 2>> 文件 | 以追加的方式,把命令的错误输出输出到指定的文件或设备当中。 |
例1.标准输出重定向
#ls命令查看目录内的内容为aaa、bbb、ccc
[root@192 lhh98330]# ls
aaa bbb ccc
#输出重定向,将ls内容输出到newfile这个文件中,不再显示在屏幕上
[root@192 lhh98330]# ls > newfile
#再次通过ls命令查看目录内的内容
[root@192 lhh98330]# ls
newfile aaa bbb ccc
#通过cat命令查看newfile内容,和ls中的一致
[root@192 lhh98330]# cat newfile
newfile
aaa
bbb
ccc
#将date命令重定向在newfile文件中
[root@192 lhh98330]#date > newfile
#通过cat命令查看newfile内容
#发现date命令覆盖了ls的内容
[root@192 lhh98330]#cat newfile
2020年 08月 11日 星期二 10:19:42 CST
#">"为覆盖重定向,">>"则为追加重定向,
#用">>"再次将date写入newfile
#不会覆盖之前的date,会出现两条date内容
[root@192 lhh98330]#date >> newfile
2020年 08月 11日 星期二 10:19:42 CST
2020年 08月 11日 星期二 10:20:33 CST
例2.错误输出重定向
#输入一条不存在的命令lst,执行结果会报错
[root@192 lhh98330]#lst
bash: lst: 未找到命令...
#如果用输出重定向,错误结果是保存不了的
[root@192 lhh98330]#lst >> newfile
bash: lst: 未找到命令...
#错误输出需要用错误输出重定向
#将lst内容输出到newfile这个文件中,不再显示在屏幕上
[root@192 lhh98330]#lst 2>> newfile
#通过cat命令查看newfile内容,错误输出结果包含在内
[root@192 lhh98330]#cat newfile
2020年 08月 11日 星期二 10:19:42 CST
2020年 08月 11日 星期二 10:20:33 CST
bash: lst: 未找到命令...
等等……错误输出重定向,需要我们提前知道命令是正确的还是错误的,如果我知道这个命令是错的,我把他改正不就行了吗?还输出他干嘛……
所以像这种正确输出和错误输出分别保存的方法在实际中用处不大,我们用到更多的是正确输出和错误输出同时保存
3.正确输出和错误输出同时保存
正确输出和错误输出同时保存 | 命令 > 文件 2>&1 | 以覆盖的方式,把正确输 出和错误输出都保存到同 一个文件当中。 |
---|---|---|
命令 &>文件 | ||
命令 >> 文件 2>&1 | 以追加的方式,把正确输出和错误输出都保存到同一个文件当中。 | |
命令 &>>文件 | ||
命令 >> 文件1 2>>文件2 | 把正确的输出追加到文件1中,把错误的输出追加到文件2中 |
例1:正确输出和错误输出同时保存
#不管错误输出还是正确输出都保存在同一文件里
[root@192 lhh98330]#date &>> file
[root@192 lhh98330]#lst &>> file
[root@192 lhh98330]#cat file
2020年 08月 11日 星期二 14:55:42 CST
bash: lst: 未找到命令...
#把正确的输出追加到文件1中,把错误的输出追加到文件2中
[root@192 lhh98330]#date >> file1 2>> file2
#正确输出保存在file1中
[root@192 lhh98330]#cat file1
2020年 08月 11日 星期二 14:56:42 CST
#因为date为正确输出,所以file2为空
[root@192 lhh98330]#cat file2
PS:命令 &>/dev/null:不管命令是否正确,直接丢入这个文件,不保存任何数据,在写shell脚本时有用,比如说我们在写Shell脚本的时候,有些命令行在Shell执行的时候他会有一些输出,这个输出对于我们整个脚本没有任何意义,但是他的命令格式本身就会输出,这个时候就可以用这个方式把他丢到垃圾箱。
4.输入重定向
我们执行命令的参数应该是键盘来输入,我改变他的输入方向,不再以键盘来输入,而是以文件来输入。
格式:命令<文件,把文件作为命令的输入
[root@192 lhh98330]#wc [选项] [文件名]
选项: -c 统计字节数
-w 统计单词数
-l 统计行数
例1.把文件newfile作为命令wc的输入
[root@192 lhh98330]# wc < newfile
8 8 45 #8行,8个单词,45个字符(包含回车符)
END