一些终端命令、程序、脚本(crontab)中,常会遇到,">/dev/null 2>&1 "出现,这具体代表什么意思呢,接下来会一步步操作,大概理清楚流程及作用(咳咳,那个,一些linux内置的方法咱就不理了)
先解释一下字面意思:
>/dev/null 就是重定向,将结果(标准输出)重定向到空设备文件,也就是不输出任何信息到终端,不显示任何信息。1>/dev/null 也是一样的,因为不写的话默认是 1
2>&1 就是将 标准错误输出重定向到标准输出,因为之前标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设备文件。通俗点说,& 表示等同于的意思,2>&1,表示2的输出重定向等于于1
原由:
shell脚本
注:shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行。shell实际上可以理解为一个命令解释器,既是一种命令语言,又是一种程序设计语言。
对于某些后台来说,一般是输入某些参数来进行计算或查询,或者是定时任务,那么我们有时候就会需要知道脚本运行的结果,而这个结果是直接输出到控制台,还是输出到一个文件内,有时在运行的过程中会有堆栈的异常,外部接口调用的情况,这些异常的结果,我们一般都会写到日志内,这就是shell重定向,也就是这篇文章要讲的内容。
再讲重定向之前,还需要知道一些linux的基础。下面会一一讲解。
linux标准文件描述符
文件描述符 | 类型 | 默认情况 | 对应文件句柄位置 |
---|---|---|---|
0 | 标准输入(缩写:STDIN) | 从键盘获得输入 | /proc/self/fd/0 |
1 | 标准输出(缩写:STDOUT) | 输出到屏幕(即控制台) | /proc/self/fd/1 |
2 | 错误输出(缩写:STDERR) | 输出到屏幕(即控制台) | /proc/self/fd/2 |
我们平常执行shell命令,都是将命令输入,然后结果显示到控制台,但,也可以通过更改文件描述符的指向,来将结果输入到我们自定义的文件,1 代表标准结果输出,2 代表错误输出,举个例子。
输出重定向
cd /home/script/ && /home/php5210/bin/php dis_file.php > /dev/null 2>&1
这个就是在机器上有 /home/script/ 路径 ,由于机器没有安装php环境变量(就算安装了,为了稳妥起见,也会选择这种方式),所以 /home/php5210/bin/php 准备执行 dis_file.php 文件
至于最后的两个,
> /dev/null
其中 > 代表 输入到 的意思,将左边内容输入到右边。>> 表示追加。
注:一个 > 是生成文件,若以前有文件,会删除,重新覆盖本次执行的内容
这个是输入正常标准结果,接下来试试错误的输出结果到文件:2 > 日志名称
输入重定向
命令 | 介绍 |
---|---|
command <filename | 以filename文件作为标准输入 |
command 0<filename | 同上 |
command <<delimiter | 从标准输入中读入,直到遇到delimiter分隔符 |
输出重定向是 > 追加是 >>,同理:
输入重定向就是 < 号,追加就是 << ,看例子
有服务器的话,可以自己试一下。
正题
还是上面的例子,重新写一下:
cd /home/script/ && /home/php5210/bin/php dis_file.php > /dev/null 2>&1
> /dev/null 2>&1 ,拆成两个(貌似跟文章开始解释的重复,凑合着看吧)
1、> /dev/null 相当于 1> /dev/null,就是将标准输出,重定向到 /dev/null ,/dev/null 表示Linux的空设备文件 ,写到里面,就找不着,等于没写,不用挣扎了,真的找不到的。
2、 2>&1 就是重定向绑定,&是用来连接的,就是绳子,将两个输出(标准输出、错误输出)绑定到一块,一根绳儿上的蚂蚱。这样一来,错误输出,嘿嘿,你也找不到,不需要错误输出。
扩展一下:
> /dev/null 2>&1 2>&1 > /dev/null > /dev/null 2> /dev/null 区别
我们最常见的是第一种写法 > /dev/null 2>&1 ,这个不做解释了,直接看第二种写法:
2>&1 > /dev/null
linux在执行shell命令之前,已经默认会确定好输出位置,并从左往右执行重定向命令,所以对于这个来说,错误输出,仍是会输出到屏幕,不会丢弃
> /dev/a.log 2> /dev/a.log
如果连续写两个这个,有可能会出现乱码(应该是有极大可能),因为会强占通往a.log的管道,所以,尽量不要这么搞,无解,老老实实按照正常写的来吧,代码嘛,最强大的,ctrl+c ctrl+v