2>&-,2> / dev / null,|&,&> / dev / null和> / dev / null 2>&1之间的区别


191

只是寻找之间的区别

  • 2>&-
  • 2>/dev/null
  • |&
  • &>/dev/null
  • >/dev/null 2>&1

以及它们与便携non-Bourne shellstcshmksh等等。


2
请注意,尽管mksh支持&>GNU bash兼容性,但强烈建议不要使用它,因为对其进行解析可能会破坏现有POSIX脚本的语义,而mksh已经在POSIX模式下将其禁用。
mirabilos 2014年

我也看到^ /dev/null了这是做什么的?
balupton

Answers:


241

对于背景:

  • 一个数1 =标准输出(即STDOUT)
  • 一个数2 =标准误差(即STDERR)
  • 如果未明确给出数字,则shell会假定数字1(bash)

首先,让我们解决这些功能。有关参考,请参阅《高级Bash脚本指南》

职能

2>&-

此格式的一般形式是M>&-,其中“ M”是文件描述符号。这将关闭所引用文件描述符(即“ M”)的输出

2>/dev/null

此格式的一般形式是M>/dev/null,其中“ M”是文件描述符号。这会将文件描述符“ M”重定向到/dev/null

2>&1

此格式的一般形式是M>&N,其中“ M”“ N”是文件描述符号。它将文件描述符“ M”“ N”的输出组合到单个流中。

|&

这只是的缩写2>&1 |。它是在Bash 4中添加的。

&>/dev/null

这只是的缩写>/dev/null 2>&1。它将文件描述符2(STDERR)和描述符1(STDOUT)重定向到/dev/null

>/dev/null

这只是的缩写1>/dev/null。它将文件描述符1(STDOUT)重定向到/dev/null

可移植到非bash,tcsh,mksh等

我对csh和以外的其他shell处理不多tcsh。与bash的重定向操作符相比,我对那2个的经验是,bash在这方面更胜一筹。有关更多详细信息,请参见tcsh手册页

csh / tcsh直接支持您询问的命令中没有的命令。您必须使用不同的语法来构造类似的函数。


我们有一个赢家。但是,所以没有性能上的差异或一些这样的与2>&-VS 2>/dev/null(除了一些“不好”编写的程序不undrestand其他2>&-正确)?
2013年

3
性能应该没有差异。
slm

5
&>bash从一开始(并打破Bourne和POSIX兼容,因为它意味着不同的东西有,但不太可能被击中)。>&并且|&来自(t)csh(这是重定向stderr的唯一方法)。它们zsh从一开始就加入,直到最近才添加到中bash。另请参见rc设计更好的运算符。
斯特凡Chazelas

1
更新:关于性能问题,也在此处得到确认:unix.stackexchange.com/questions/163955/…–
Det

1
您好@slm,感谢您的联系。我很高兴我的仓库没有变化(+2-2=0)。现在,对于版本部分,我不会做太多编辑,但是在这种情况下,我会进行编辑,因为它阐明了操作后的数据将位于N。我已经读完您的回答,并且在各个方面都很好。只是这个小小的歧义让我思考,这就是为什么要发行该版本。但是,好的,您可以随意重新添加或拒绝它。我希望我能解释这一点。保持良好的工作。
Beco博士

11

这是用于重定向STDERR&STDOUT:

  • 2>/dev/null

    将STDERR重定向到/ dev / null(防止在控制台上显示)

  • |&

    将STDERR和STDOUT重定向到管道命令(cmd1 |&cmd2)的STDIN

  • &>/dev/null

    将STDERR和STDOUT都重定向到/ dev / null(控制台上没有任何显示)

  • >/dev/null

    将STDOUT重定向到/ dev / null(控制台上仅显示STDERR)

  • 2>&-

    用于关闭用于重定向的文件描述符

这些都是Bourne Shell的标准重定向方法。


4
|&并且&>/dev/null便于携带。
克里斯·

4

将此视为所选答案的附录。您可能想知道哪种表格是POSIX,哪些不是。

涉及两种POSIX形式:

2.7.2重定向输出

重定向输出的两种常规格式是:

[n]>字

[n]> |字

其中可选的n表示文件描述符号。如果省略该数字,则重定向应参考标准输出(文件描述符1)。

如果设置了noclobber选项(请参见set -C的描述)并且使用word扩展名命名的文件存在并且是常规文件,则使用'>'格式的输出重定向将失败。否则,请使用'>'或“> |”进行重定向 格式将导致其名称由单词扩展产生的文件被创建并打开以在指定的文件描述符上输出,如果未指定,则为标准输出。如果文件不存在,则应创建该文件;否则,打开后应截断为空文件。

--

2.7.6复制输出文件描述符

重定向运算符:

[n]>&word

应从另一个复制一个输出文件描述符,或将其关闭。如果word评估为一个或多个数字,则用n表示的文件描述符,或如果未指定n的标准输出,应作为用word表示的文件描述符的副本;如果单词中的数字不代表已经打开输出的文件描述符,则将导致重定向错误;请参阅Shell错误的后果。如果word求值为'-',则关闭文件描述符n,如果未指定n,则关闭标准输出。尝试关闭未打开的文件描述符不会构成错误。如果单词评估为其他内容,则行为是不确定的。

因此:

Function      POSIX-compat    POSIX 
2>&-          Yes             close 
2>/dev/null   Yes             redir
2>&1          Yes             dup 
|&            No              
&>/dev/null   No
>/dev/null    Yes             redir
>&/dev/null   ?               ?dup

最后一行不在最初的问题中,但使用bash可以毫无抱怨地工作。(也可以用/ dev / tty代替/ dev / null)。


1
我一直想知道更多。
挪威
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.