shell入门第十讲
1、Linux标准流
在Linux中, 标准输入 是标准输入流,这接受文本作为其输入,我们看到的stdin就是标准输入流之意(也称为输入重定向)。从命令到shell的文本输出是通过 标准输出 (标准输出)流,stdout就是标准输出流之意(也称为输出重定向),来自命令的错误消息通过发送 标准错误 (标准错误)流,比如stderr就是标准错误流之意(也称为错误重定向)。
我们之前给大家介绍过,一个命令不管执行成功与否,都会产生一个状态值,这个值如果是0,就表示命令执行成功了,如果是1~255之间的任意一个数字,均表示执行失败。
那么在Linux标准流中,stdout和stderr也同样如此。如果我们使用了Linux标准流的功能,当我们执行一个命令成功后,那么终端打印的信息也将会被传送至stdout中。当我们执行命令失败后,那么终端打印的报错信息也将会被传送至stderr中。
1.1、stdout
输出重定向我们一般使用 >来表示,比如将信息输出重定向到一个文件中。
举一个例子来说明一下:
bash [root@master1 ~]#echo "this is a information" this is a information [root@master1 ~]#echo $? 0 [root@master1 ~]#echo "this is a information" > c.txt [root@master1 ~]#cat c.txt this is a information
当我们使用echo来打印一段信息的时候,我们通过$?判断出来这是执行成功的,因此我使用stdout将正确的信息传给c.txt这个文件中。c.txt我可以不必提前创建,重定向输出stdout会自动帮我们建立好一个文件并且将打印信息写入这个文件中。
1.2、stderr
错误重定向我们一般使用 2> 来表示,比如将错误信息重定向到一个文件中。比如:
bash [root@master1 ~]#ls #我ls查看刚刚的c.txt这个文件 c.txt [root@master1 ~]#catt c.txt #我想查看内容时不小心把cat命令写错了, bash: catt: 未找到命令… #然后就报错了。 相似命令是: 'cat' [root@master1 ~]#catt c.txt 2> d.txt #将报错信息写入其他的文件d.txt中。 [root@master1 ~]#cat d.txt bash: catt: 未找到命令… 相似命令是: 'cat' [root@master1 ~]#
我不小心把cat命令写错了catt命令,那么肯定是执行失败的,毕竟Linux操作系统里面没有catt这个命令,所以shell就返回给我们错误信息了。
1.3、stdin
输入重定向stdin,我们一般使用 <这个符号来表示,比如: bash [root@master1 ~]#cat c.txt this is a information [root@master1 ~]#wc -l < c.txt 1 将c.txt文件内容通过标准输入重定向到wc命令中,随后我们可以统计出c.txt文件的行数。 不过 stdin一般用于键盘输入字符,下面我们会讲。 1.4、追加信息输出重定向 我们上面的stdout和stderr只是将信息输出到一个文件中,如果再次重定向输出的话,文件之前的内容将会被覆盖掉,只会写入最新的内容到文件中,比如: bash [root@master1 ~]#cat c.txt this is a information [root@master1 ~]#echo "this is two information" > c.txt [root@master1 ~]#cat c.txt this is two information
你会发现重定向只是把最新的内容写到文件中了,文件之前的内容会被覆盖,因此我们需要追加重定向,也就是说新的内容会接着之前写入的文件内容继续添加,比如:
bash [root@master1 ~]#echo "this is three information" >> c.txt [root@master1 ~]#cat c.txt this is two information this is three information
错误重定向也是如此,如果只是使用2>同样也会清空旧信息,把新内容现在写进去,因此追加错误信息使用2>>即可,比如:
bash [root@master1 ~]#cat d.txt bash: catt: 未找到命令… 相似命令是: 'cat' [root@master1 ~]#catt c.txt 2>> d.txt ##命令再次使用错误 [root@master1 ~]#cat d.txt bash: catt: 未找到命令… 相似命令是: 'cat' bash: catt: 未找到命令… ## 这是新的错误信息 相似命令是: 'cat'
1.5、同时进行标准输出和错误输出至文件
在企业中往往是这么干的,写一个脚本,包含很多命令,那么我们需要将打印服务信息的命令写上stdout和stderr,因为日志文件有助于我们排查问题所在,比如:
bash [root@master1 ~]#cat c.txt >> f.txt 2>> h.txt [root@master1 ~]#cattt c.txt >> f.txt 2>> h.txt [root@master1 ~]#cat f.txt this is two information this is three information [root@master1 ~]#cat h.txt bash: cattt: 未找到命令… [root@master1 ~]#
正如命令第一、二行所示,我们写上一个命令时,把stdout信息写入一个文件f.txt中,stderr信息写入错误日志文件h.txt中。当执行成功的命令便会把正确信息输出到文件中,错误的信息输出到其他的文件中,方便我们排查问题所在。
当然,把标准输出stdout和错误输出stderr到一个文件也是可以的,这个时候我们需要使用到符号 2> &1 或者是 &>>这两种,比如:
bash [root@master1 ~]#cat c.txt &>> s.txt #这是正确输出 [root@master1 ~]#cat s.txt this is two information this is three information [root@master1 ~]#catt c.txt &>> s.txt #这是错误输出 [root@master1 ~]#cat s.txt this is two information this is three information bash: catt: 未找到命令… 相似命令是: 'cat' [root@master1 ~]#
或者是
bash [root@master1 ~]#cat c.txt >> x.txt 2>&1 #这是正确输出 [root@master1 ~]#catt c.txt >> x.txt 2>&1 #这是错误输出 [root@master1 ~]#cat x.txt this is two information this is three information bash: catt: 未找到命令… 相似命令是: 'cat'
可以看到正确输出的内容和错误输出的内容都是以追加的方式写入一个文件中的,符合我们的预期。
当然你也可以写入Linux的无底洞/dev/null,也就是不管命令执行成功与否,都不要给我们打印任何信息。比如
bash [root@master1 ~]#ls /tmp &> /dev/null
1.6、几个符号的意思
那么说到这里,我跟你说几个符号及可能就看明白了,但是你可能有疑惑,为什么错误输出是使用数字2呢?因为这是Linux本身设计的,记住就行,除此之外,0和1是可以省略的,比如>和1>是一样的,但是2表示stderr却不能省略,必须要加上才行。
bash /dev/null 表示空设备文件 0 表示stdin标准输入 1 表示stdout标准输出 2 表示stderr标准错误
记住上面几个符号的意思,因为工作中会经常使用。
声明:文章来源于网络,如有侵权请联系删除!