Shell输入输出重定向命令
1、标准输入输出
就是指的是计算机的输入输出设备,
输入设备比如键盘,鼠标,写字板等等。而标准的输入设备就是键盘,早起的计算机是没有鼠标的。
而输出设备比如显示器,打印机等,那么标准的输出设备就是显示器。
如下表:
设备|设备文件名|文件描述符|类型
键盘|/dev/stdin|0|标准输入
显示器|/dev/stdout|1|标准输出
显示器|/dev/stderr|2|标准错误输出。
那么在Linux里面所有设备都是用文件名来表示的,上表就是这些标准输入输出的设备名,因为设备名很不容易记忆,所以分别给他们设置了描述符,分别为0,1,2.
也就是0代表键盘,1代表显示器,2代表错误显示器。
2、输出重定向
正常来说我们都是需要把输出的内容输出到显示器上,而如果我们不让他在显示器显示,而是输出到某一个文件里,那么这就叫做输出重定向。
那么为什么要进行输出重定向呢?用途在哪里呢?
前文我们讲过我们尽可能不要在服务器的数据高峰期进行备份或复制解压缩等等命令执行,会导致服务器宕机。所以我们只能在凌晨这个时间段来进行操作,可是我们如果手动进行操作的话就需要起大早,很辛苦。
其实在win和linux里都有定时操作的功能,所以我们只需要写一个定时脚本文件,让他自动在某个时间来执行某项任务就行了。
但是,如果没有记录的话,我们怎么能知道这个命令是否正确执行了呢?
所以我们就需要用命令重定向功能,把命令执行的过程都输出到一个指定的文件里,这样就可以供我们查看命令执行的过程是否正常。有点和日志差不多,只不过记录的方法不一样。
这就是输出重定向最常用的功能。
A、标准输出重定向。
命令 > 文件:以覆盖的方式,把命令的正确输出输出到指定的文件或设备当中。
命令 >> 文件:以追加的方式,把命令的正确输出输出到指定的文件或者设备当中。
例如:
ls命令正常是查看一个目录下的文件信息的,他可以输出每个文件或目录名,那么如果我们直接用ls命令,就会把结果输出到屏幕上面。
如果我们用输出重定向命令,比如:
[root@localhost ~]# ls > abc
这样ls就不会把结果输出在屏幕上了,而是输出到指定的文件abc里了,如图:
再比如:date命令可以输出当前时间,我们能不能也用同样的重定向把时间输出到文件abc里面呢?当然可以,
[root@localhost ~]# date >> abc
注意,我这里用的是两个尖括号,这样就可以用追加的方式输出到文件abc里,如果只用一个尖括号的话,就会把abc里面原来的内容给覆盖掉的。
如图:
看,是不是挺有意思的。
B、标准错误输出重定向。
错误命令 2> 文件:以覆盖的方式,把命令的错误输出输出到指定的文件或设备当中。
错误命令 2>> 文件:以追加的方式,把命令的错误输出输出到指定的文件或设备当中。
那么什么又是错误输出重定向呢?其实很简单,就是把错误的输出信息重定向到某个指定的文件里面的意思。其实就是把命令报错信息保存下来了。
比如:
[root@localhost ~]# lsa 这个命令是不存在的,正常会在屏幕输出此命令的错误信息。
如果我们想让这条错误提示输出到指定的文件里,我们就用到了标准错误输出重定向了。
[root@localhost ~]# lsa 2>> abc
这样就把错误的提示写入了abc里面了,那么两个尖括号前面的’2’代表的就是标准错误输出描述符,本文的最开始说过了,用文件名表示太麻烦,所以定义的描述符。0代表标准输入,1代表标准输出,2代表标准错误输出,所以就用到了2。
但是前面正确的标准输出为什么没用1呢?其实默认就是标准正确输出,所以省略了。
如图:
这样就把错误信息给保存下来了,需要注意的是描述符2和两个尖括号之间不能留有空格。
那么大家需要注意的是不是所有命令都可以用重定向的,必须要有输出的命令才能用输出重定向,比如cd命令是进入到某个目录下,他只会执行,而不具备输出能力,所以就不能用。而echo就具备输出打印功能,这样的命令就可以使用输出重定向。
C、其实在正常应用中单独使用正确输出从定向和错误输出重定向是没有什么意义的,为什么呢?
你看,如果我已经知道是正确的输出了,我还记录他干嘛啊。
而,如果我已经知道是错误输出,我就直接把他修改正确就完事了,又何必让他错误输出呢?
所以在正常情况下我们是不知道一条命令是否写错,所以才会用到输出重定向的,比如我们某条命令写错了,但是我们不知道,而执行的时候才会发现。
也就是说正常情况下,我们是把正确输出和错误输出同时重定向到某个文件来进行保存,这才有意义。
我们来看同时重定向输出的几种命令写法:
命令 > 文件 2>&1:以覆盖的方式,把正确输出和错误输出都保存到同一个文件当中。
命令 >> 文件 2>&1:以追加的方式,把正确输出和错误输出都保存到同一个文件当中。
命令 &> 文件:以覆盖的方式,把正确输出和错误输出都保存到同一个文件当中。
命令 &>> 文件:以追加的方式,把正确输出和错误输出都保存到同一个文件当中。
命令>>文件1 2>>文件2:把正确的输出追加到文件1中,把错误的输出追加到文件2中。
其实看似挺繁琐的,但实际前四个命令是一样的,一类是覆盖,一类是追加,效果也是一样的,只不过命令的表达方式不一样而已,标准的写法是:命令 &>> 文件,我们记住就行了。
他们具体的不同:命令 >> 文件 2>&1 ,这种写法是先把错误的输出保存到正确的输出里面,然后同时追加到指定的文件里。
而,命令 &>> 文件 是直接把正确和错误的输出都同时保存到指定的文件夹里。
最终的效果是一模一样的。
那么还有一种比较常见的写法:
[root@localhost ~]# ls &>/dev/null
大家都知道null就是什么都没有的意思,相当于黑洞,也就是说无论正确的还是错误的信息我们都给他重定向输出的null里,相当于扔进了垃圾桶,不让他显示。
那这种方法实际操作过程当中常用于写脚本的时候,我们在写脚本的时候,一些命令会有一些无关紧要的提示,跟我们什么关系都没有,所以我们不想让他显示,那么就用这个重定向到垃圾桶里。后面会学到。
那么另外一种用法就是正确的输出和错误的输出分别保存,
[root@localhost ~]# ls >> abc 2>>bcd
这样就把正确的输出保存到abc里,把错误的输出保存到bcd里面了,而我们只需要查看bcd就能知道是哪条命令报错了,也比较常用,就看我们的个人习惯了。
如图:
红色的是正确输出保存到abc里
黄色的是错误输出保存到cde里面
就这么简单。
3、输入重定向
[root@localhost ~]# wc [选项][文件名]
选项:
-c:统计字节数
-w:统计单词数
-l:统计行数。
首先我们看上面这个命令wc,这是一个统计的命令,比如我们输入wc后,我们就在下面输入字符或单词,最后按CTRL+D结束,她就会自动给我们统计出我们输入了几行几个单词和多少个字符,如图:
她就给我们统计除了,我们输入了5行,9个单词和51个字符,单词是按照空格识别的。
这是这个命令的作用,能统计我们键盘的输入操作。
那么什么又是输入重定向呢?
也就是正好和输出重定向相反。
正常我们标准输入是用键盘输入,而经过输出重定向后呢就不是用键盘了,而是用某个文件里的内容来进行输入。这就是输入重定向,输入重定向使用的范围并没有输出重定向那么广泛。用处不大,一般用于给源码包打补丁。
而输入从定向怎么用呢?
命令<文件:把文件作为命令的输入
刚才我们用wc命令的时候是手动在屏幕输入内容让wc来进行统计的,而有了输入重定向我们就用某个文件里面的内容来作为输入而来进行统计了,比如:
[root@localhost ~]# wc < abc
这就会统计出abc里面的内容行数单词数以及字符数了,如图:
15102505
当然我们还可以添加选项:
[root@localhost ~]# wc -l < abc只统计行数
[root@localhost ~]# wc -c < abc 只统计字节数
[root@localhost ~]# wc -w < abc 只统计单词数。
这个命令不常用,大家能理解就可以了。我们主要还是把输出重定向掌握了就行了。
那么还有一种用法就是:
[root@localhost ~]# wc << girl
这个时候我们可以在命令行输入任意内容,直到再次出现girl的时候命令就停止了,而不用CTRL+D来停止了,他的作用是统计两个相同字符串间的数据,这个就更不常用了。大家自己尝试一下。
本教程原创作者:mageo,出自每集博客,尊重作者劳动,转载请注明出处:http://www.ql2015.cn,谢谢!