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

Det*_*Det 237 shell io-redirection file-descriptors csh portability

只是寻找之间的区别

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

以及它们与非的Bourne shell喜欢便携性tcsh,mksh等等。

slm*_*slm 286

对于背景:

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

首先让我们处理这些的功能。有关参考,请参阅高级 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 直接支持您询问的命令中没有。您必须使用不同的语法来构造类似的函数。

  • `&>` 从一开始就在 `bash` 中(并且破坏了 Bourne 和 POSIX 的兼容性,因为它在那里意味着不同的东西,尽管不太可能被击中)。`>&` 和 `|&` 来自 `(t)csh`(这是它们重定向 stderr 的唯一方法)。它们从一开始就在 `zsh` 中,最近才被添加到 `bash`。另请参阅 `rc` 以获得更好的设计运算符。 (6认同)
  • 应该没有性能差异。 (3认同)
  • 更新:关于性能问题,这里也确认了:http://unix.stackexchange.com/questions/163955/is-more-efficient-than-dev-null (2认同)

Bri*_*Guy 14

这是用于重定向 STDERR 和 STDOUT:

  • 2>/dev/null

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

  • |&

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

  • &>/dev/null

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

  • >/dev/null

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

  • 2>&-

    用于关闭与重定向一起使用的文件描述符

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

  • `|&` 和 `&>/dev/null` 是*不可*的。 (4认同)

Cra*_*cks 6

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

涉及两种 POSIX 形式:

2.7.2 重定向输出

重定向输出的两种通用格式是:

[n]>词

[n]>|词

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

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

——

2.7.6 复制输出文件描述符

重定向运算符:

[n]>&word

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

所以:

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
Run Code Online (Sandbox Code Playgroud)

最后一行不在原始问题中,但它在 bash 中没有任何抱怨。(也适用于 /dev/tty 代替 /dev/null)。

  • 我总是想了解更多。 (2认同)