Answers:
对于背景:
首先,让我们解决这些功能。有关参考,请参阅《高级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
。
我对csh
和以外的其他shell处理不多tcsh
。与bash的重定向操作符相比,我对那2个的经验是,bash在这方面更胜一筹。有关更多详细信息,请参见tcsh手册页。
csh / tcsh直接支持您询问的命令中没有的命令。您必须使用不同的语法来构造类似的函数。
2>&-
VS 2>/dev/null
(除了一些“不好”编写的程序不undrestand其他2>&-
正确)?
&>
是bash
从一开始(并打破Bourne和POSIX兼容,因为它意味着不同的东西有,但不太可能被击中)。>&
并且|&
来自(t)csh
(这是重定向stderr的唯一方法)。它们zsh
从一开始就加入,直到最近才添加到中bash
。另请参见rc
设计更好的运算符。
(+2-2=0)
。现在,对于版本部分,我不会做太多编辑,但是在这种情况下,我会进行编辑,因为它阐明了操作后的数据将位于N
。我已经读完您的回答,并且在各个方面都很好。只是这个小小的歧义让我思考,这就是为什么要发行该版本。但是,好的,您可以随意重新添加或拒绝它。我希望我能解释这一点。保持良好的工作。
这是用于重定向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
是不便于携带。
将此视为所选答案的附录。您可能想知道哪种表格是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)。
&>
GNU bash兼容性,但强烈建议不要使用它,因为对其进行解析可能会破坏现有POSIX脚本的语义,而mksh已经在POSIX模式下将其禁用。