[通俗易懂:Linux标准输入/输出和重定向]Shell脚本之 > /dev/null 2>&1命令详解
目录标题一、> /dev/null 2>&1 命令解析二、/dev/null 文件浅显理解三、标准输入、标准输出、标准错误输出四、输入重定向、输出重定向五、命令作用与应用场景如果想看命令意义,可以直接跳到第五部分一、> /dev/null 2>&1 命令解析我们在别人的脚本里面常常可以看见这样的代码:2>/dev/null或者是这样:0 */3 * *
如果想看命令意义,可以直接跳到第五部分
一、> /dev/null 2>&1 命令解析
我们在别人的脚本里面常常可以看见这样的代码:
2>/dev/null
或者是这样:
0 */3 * * * /usr/local/apache2/apachectl restart >/dev/null 2>&1
那么,它们到底是什么意思呢?
解析 > /dev/null 2>&1
要了解这句代码的意思,我们要把它拆分开来一一理解,再融会贯通,才能体会Linux的精密与奥妙。
看起来这是一行代码,实际上,这是两条命令组合而成:
如果你知道 >
的意思,那么你就会明白,这是两条输出重定向命令。
从符号来解析的话,它可以解析成三种不同元素:
>
:即我们刚才提到的输出重定向符号/dev/null
:一个特殊文件2 、&1
:1和2是标准输出和标准错误输出的数值表示,它们还有一个兄弟0:标准输入
接下来,我们一一解析这三个元素,探索命令背后的顶层含义。
二、/dev/null 文件浅显理解
/dev/null
是Linux中的特殊文件之一,或称空设备,它丢弃一切写入其中的数据(但报告写入操作成功),读取它则会立即得到一个EOF,又被称为位桶(bit bucket)或者黑洞(black hole)。
大部分人比较喜欢理解为Windows的垃圾桶,不过我更喜欢理解为是一根下水管道。划重点:无论我们向其输入任何数据,都会被它丢弃,且操作成功。
echo hello world > ./null
它还有两个离得很近的兄弟,zreo
和random
。
/dev/zero
: 在类UNIX 操作系统中, /dev/zero 是一个特殊的文件,当你读它的时候,它会提供无限的空字符(NULL, ASCII NUL, 0x00)。
简简单单的一行命令,瞬间产生3.5G数据,直呼内行。
cat ./zero >> ./test.txt
/dev/random
:一个特殊的设备文件,可以用作随机数发生器或伪随机数发生器。它允许程序访问来自设备驱动程序或其它来源的背景噪声。
总结:null是丢弃东西的,zero是产生空白字符的,random是生成随机数的,重点记住null就可以了,后面两个绝大部分场景用不上。
三、标准输入、标准输出、标准错误输出
我们执行一个shell命令行时通常会自动打开三个标准文件,即标准输入文件(stdin),通常对应终端的键盘;标准输出文件(stdout)和标准错误输出文件(stderr)。Linux终端用2表示标准错误,1表示标准输出,0表示标准输入。
标准输出文件和标准错误输出文件都对应终端的屏幕。进程将从标准输入文件中得到输入数据,将正常输出数据输出到标准输出文件,而将错误信息送到标准错误文件中。
总结:这一块不用过于抠字眼和理解内涵,我们只需要了解:执行一个shell命令会有输出:标准输出或者错误输出,对应的数值为1,2。如果我们看见1,就要明白指代标准输出信息,看见2明白指代输出错误信息。
四、输入重定向、输出重定向
除了输入重定向、输出重定向(重点),还有标准输入。
符号表示:
-
>
重定向标准输出,> filename就是把标准输出存储到文件filename里面。
-
-
(短横线):表示标准输入,一般用于1个程序需要多个输入的时候。
-
<
标准输入,后面可以跟可以产生输出的命令,输入重定向主要用于改变一个命令的输入源,特别是改变那些需要大量输入的输入源。应用场景:使用一个不接受文件名作为输入参数的命令,而需要的输入内容又存在一个文件里时。
注意:>
重定向便准输出,这个命令只针对标准输出,也就是说,如果有错误的信息,还是会打印在屏幕上。
理解了重定向之后,再结合标准输出和标准错误输出,就比较好理解。我们可以结合二者做一个demo。
写一个简单的脚本,包含一条正确的命令和错误的命令,然后使用重定向功能定向到文件。
执行
可以看到第一条echo命令成功执行,并被重定向到echo.txt文件中,而cat命令因为当前目录没有这个文件,执行失败,而>
符号只能重定向标准输出,因为cat是错误输出,所以未被输出重定向到文件夹,而是输出到屏幕。
总结:输出重定向是重点,我们可以把它理解为,把前一个命令的输出,作为后一个命令的输入。
五、命令作用与应用场景
命令作用:
分别理解了各自的命令意义,串联起来:
第一个重定向的意思是不输出信息,但输出错误信息,第二个重定向的意思是将标准错误输出重定向到标准输出,连起来的即为:不输出信息,不管是标准输出还是错误输出。
怎么求证呢?来个demo
写个一键启动Hadoop的小脚本
运行:
可以看到除了两个echo,还有很多运行的标准输出
重定向操作,可以加在脚本执行的后面,也可以选择执行脚本的时候手动加重定向,此次选择第一种操作。
再次运行
作用:
- 用于定时任务的消息邮件清理:定时任务执行时,会发送一封邮件给执行的用户,如果是比较基础的定时任务,日积月累下来,会影响系统的开销,占用存储。
- 清理不必要的提示:Shell脚本执行的时候,如果输出大量的标准输出,影响用户交互体验。
可能大部分人看完,会有两个疑问:
第一:为什么 2 > &1 有个&符号
答:如果不加&
表示重定向到“1”这个文件,&1表示标准输出
第二:为什么是先重定向到null
文件,而不是先 2> & 1
?会影响到错误输出的重定向吗?
答:优先级问题。错误输出重定向优先于命令重定向,故重定向到null
文件时,是标准输出和标准错误输出一起null
demo:
执行
天道酬勤,自强不息
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)