只是在寻找


2>&-
和它们的可移植性之间的区别
2>/dev/null
|&
&>/dev/null
>/dev/null 2>&1
tcsh

带有非伯恩(bourne)壳,例如mksh,q4312079q等。

评论

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

我也看到了^ / dev / null可以做什么?

#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并没有太多处理cshtcsh。与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