使用 '>&!' 重定向输出

使用 '>&!' 重定向输出

我知道这>&意味着将 stderr 重定向到 stdout。

但我不知道的意思>&!,我尝试按照命令操作,但看起来很正常。

例子:

cat xxx.txt >&! xxx.output

我的环境是cshshell 和ubuntu18

有人可以教我这个吗,谢谢。

答案1

每当您遇到这样的问题时,答案几乎肯定会在手册中。我只需运行man csh,然后按 / 进行搜索,输入&!然后输入。这让我进入了相关部分:

> 名称
>! 名称
>& 名称
>&! 名称

该文件name用作标准输出。如果文件不存在,则创建该文件;如果文件存在,则将其截断,其先前的内容将丢失。

如果设置了 shell 变量noclobber,则文件必须不存在或为字符特殊文件(例如终端或dev/null),否则将导致错误。这有助于防止意外破坏文件。在这种情况下,!可以使用表格来抑制此检查。如果notempty在中给出noclobber>则允许在空文件上使用;如果ask设置了,则显示交互式确认,而不是错误。

&涉及将诊断输出路由到指定文件以及标准输出的形式。以与输入文件名name相同的方式扩展。<

因此,引用的部分解释了csh的重定向运算符。总结上述内容,>重定向到一个文件并>!强制进行重定向,即使用户设置了noclobber通常会阻止您重定向到现有文件的选项。&重定向标准错误以及标准输出,因此>&!会将 stderr 和 stdout 都重定向到一个文件,即使设置了该选项,也会覆盖文件可能具有的任何内容noclobber

答案2

注意,这个答案是针对的bash,而不是csh像OP后来添加的。


>&不是意思是将 stderr 重定向到 stdout(即2>&1),它的意思是将 stderr+stdout 重定向到某个地方。

就你的情况来说,!是某事。


来自 GNU Bash 参考手册 >>重定向
>>3.6.4 重定向标准输出和标准错误

此构造允许将标准输出(文件描述符 1)和标准错误输出(文件描述符 2)重定向到名称为 word 扩展的文件。

重定向标准输出和标准错误有两种格式:

&>word

>&word

两种形式中,第一种是首选。这在语义上等同于

>word 2>&1

因此,&>!将把 stdout+stderr 重定向到名为 的文件!

请注意,两个版本都是 GNU bashism,只有最后一个版本(>word 2>&1)符合 Posix 标准。

还要注意,!将会调用历史扩展如果发生其他事情。

相关内容