阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

shell入门第十讲

62次阅读
没有评论

共计 3254 个字符,预计需要花费 9 分钟才能阅读完成。

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 标准错误
记住上面几个符号的意思,因为工作中会经常使用。

声明:文章来源于网络,如有侵权请联系删除!

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-12-03发表,共计3254字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中