Shell中 &>/dev/null和 >/dev/null 2>&1

1. 文件描述符
下面手打一段《linux shell脚本攻略》的描述(如有侵权我会删除的 T_T):

文件描述符是与文件输入、输出关联的整数。它们用来跟踪已打开的文件。最常见的文件描述符是stidin、stdout、和stderr。我们可以将某个文件描述符的内容重定向到另外一个文件描述符中。
《linux shell脚本攻略》


文件描述符我们常见的就是系统预留的0,1和2这三个,他们的意义分别有如下对应关系:

  • 0 —— stdin(标准输入)
  • 1 —— stdout (标准输出)
  • 2 —— stderr (标准错误)

其中,shell编程里经常用到的就是描述符1,和描述符2。这样下面我们来举两个栗子,就知道神马是1和2了:

1 —— stdout
假设:在当前目录下我们“有且只有”一个文件名为 123.txt 的文本文件。这个时候我们运行下面的命令【ls 123.txt】:

我们就会获得一个标准输出stdout的输出结果“123.txt” 。

2 —— stderr
按照上面同样的假设,我们运行另外一跳命令【ls abc.txt】:

我们就会获得一个标准错误stderr的输出结果“ls:无法访问abc.txt:没有那个文件或目录”。

有同学应该会觉得,这两个事例好像跟1和2这两个阿拉伯数字好像没有关系。这个就要结合第二个知识点“重定向操作”来理解了。

2.重定向操作

书里找不到准确的关于重定向的描述,我很不要脸滴来说一下我的理解吧。重定向操作,其实就是通过在shell命令后面追加一个重定向操作符号,将shell命令对应的文件描述符输出的文本信息重新输入到另外一个指定文件的操作。

重定向操作符号有两个>和>>。尽管这两个操作符都可以将重定向到文件,但是前者会先清空文件,再写入内容;后者会将内容追加到现有文件的尾部。(对了,重定向的操作制定的文件如果原来不存在的话,重定向的操作会主动创建这个文件名的文件的)

下面我们结合第1个知识点文件描述符来举栗子吧。

重定向标准输出stdout

如上图所示,对比没有添加重定向的操作,ls命令在使用之后并没有将字符“123.txt”这个字符串打印到屏幕上。在紧接着的cat操作之后,我们可以看到本来应该输出字符串被记录在了stdout.txt这个文件里面了。

其实,对于标准输出的重定向操作,>等同于1>。上面栗子执行命令【ls 123.txt > stdout.txt】得到的效果也是一样的。

重定向标准错误stderr

如上图所示,文件描述符2,标准错误的重定向也是同样的原理被记录在了文件stderr.txt这个文件里面了。

描述符的重定向还有下面的几种用法:
你可以将stderr单独定向到一个文件,将stdout重定向到另一个文件:

cmd 2>stderr.txt 1>stdout.txt

也可以利用下面的方法,将stderr转换成stdout,使得stderr和stdout都被重新定向到同一个文件中:

cmd> output.txt 2>&1

或者采用这个方法(这个经常用到,我个人比较喜欢用这个,少写几个字符(*^__^*) )

cmd &> output.txt
cmd >& output.txt  # 两个表达式效果一样哒~

 

原文地址:https://www.cnblogs.com/xuanbo/p/10656365.html