2>&-
和它们的可移植性之间的区别
2>/dev/null
|&
&>/dev/null
>/dev/null 2>&1
tcsh
带有非伯恩(bourne)壳,例如
mksh
,q4312079q等。#1 楼
对于背景:数字1 =标准输出(即STDOUT)
数字2 =标准错误(即STDERR)
(如果未明确指定数字)给定,则数字1由shell(重击)假定。首先,让我们解决它们的功能。有关参考,请参阅《高级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等。
我对外部的其他Shell并没有太多处理
csh
和tcsh
。与bash的重定向操作符相比,我对那2个的经验是bash在这方面更胜一筹。有关更多详细信息,请参见tcsh手册页。您必须使用不同的语法来构造类似的函数。评论
性能应该没有差异。
–slm♦
13年4月6日在14:38
&>从一开始就处于流行状态(并破坏了Bourne和POSIX的兼容性,因为这意味着此处有所不同,尽管不太可能被击中)。 >&和|&来自(t)csh(这是重定向stderr的唯一方法)。它们从一开始就在zsh中使用,直到最近才被添加到bash中。另请参阅rc,以获取设计更好的运算符。
–StéphaneChazelas
2014-10-24 9:26
更新:关于性能问题,在此处也得到了确认:unix.stackexchange.com/questions/163955/…
–Det
16年4月16日在14:24
有关结束符的大警告:请勿将其用于stdin,stdout或stderr,请参见unix.stackexchange.com/questions/163955/…
–奥利维尔·杜拉克(Olivier Dulac)
17年1月20日在16:52
@slm,您好,感谢您的联系。我很高兴我的仓库没有变化(+ 2-2 = 0)。现在,对于版本部分,我不会做太多编辑,但是在这种情况下,我会进行编辑,因为它表明操作后的数据将位于N。我已读完您的答案,并且总体而言很好方面。只是这种小的歧义让我开始思考,这就是为什么要发行该版本。但是,好的,您可以随意重新添加或拒绝它。我希望我能解释这一点。保持良好的工作。
– DrBeco
17年5月1日在18:45
#2 楼
这用于重定向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的标准重定向方法。
评论
|&和&> / dev / null不可移植。
–克里斯唐(Chris Down)
13年4月3日在9:04
#3 楼
请考虑将其作为所选答案的附录。您可能想知道哪种表格是POSIX,哪些不是。
涉及两种POSIX格式:
2.7.2重定向输出
2.7.6复制输出文件描述符
2.7.2重定向输出
重定向输出的两种通用格式是:
[n]> word
[n ]> | word
其中可选的n表示文件描述符号。如果省略
数字,则重定向应参考标准输出
(文件描述符1)。
如果noclobber
'格式的输出重定向将失败。 />选项已设置(请参阅set -C的说明),并且以
扩展的单词命名的文件存在并且是常规文件。否则,
使用'>'或“> |”重定向格式将导致创建并打开其名称为
的单词的文件,并为指定文件描述符上的
输出打开(或打开),如果没有指定
,则为标准输出。如果文件不存在,则应创建文件;
否则,应在打开文件后将其截断为空文件。
-
/>
2.7.6复制输出文件描述符
重定向运算符:
[n]>&word
>应该复制另一个输出文件描述符,或者
关闭一个。如果word评估为一个或多个数字,则用n表示的文件
描述符,或者如果未指定n则为标准输出,
应作为用word表示的文件描述符的副本;如果
字中的数字不代表已经为
输出打开的文件描述符,则将导致重定向错误;请参阅Shell
错误的后果。如果word评估为'-',则关闭文件描述符n,或者如果未指定n则输出standard
。尝试关闭文件
未打开的描述符不构成错误。如果单词
得出其他结果,则行为未指定。
因此:
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
最后一行不在最初的问题中,但它可以正常运行而无需抱怨。 (也可以用/ dev / tty代替/ dev / null)。
评论
我一直想知道更多。
–Det
18年4月9日在13:05
评论
请注意,尽管mksh支持GNU bash兼容&>,但强烈建议不要使用它,因为解析它会破坏现有POSIX脚本的语义,而mksh已经在POSIX模式下将其禁用。我也看到了^ / dev / null可以做什么?