一些终端命令、程序、脚本(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

 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐