我知道这>&
意味着将 stderr 重定向到 stdout。
但我不知道的意思>&!
,我尝试按照命令操作,但看起来很正常。
例子:
cat xxx.txt >&! xxx.output
我的环境是csh
shell 和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 标准。
还要注意,!
将会调用历史扩展如果发生其他事情。