我一直在阅读有关 bash 重定向的内容,并遇到了这两篇关于它的文章
第一 :
https://www.brianstorti.com/understanding-shell-script-idiom-redirect
说明
您可以使用 &[FILE_DESCRIPTOR] 来引用文件描述符值;
然而当我与第二篇文章同时阅读时
第二个
https://catonmat.net/bash-one-liners-explained-part- Three
它指出
另请注意,在 bash 中,这样写:
$ command &>file
与以下完全相同:
$ command >&file
然而,第一种形式是优选的。
如何>&file
创建file
文件描述符
答案1
它实际上是两个相互冲突的不同操作符,一个来自 Bourne shell,一个来自 C shell。
cmd >&2
短缺
cmd 1>&2
运行cmd
时其 stdout (fd 1) 是否连接到相同资源(相同打开文件描述)与 fd 2 上的一样(x>&y
(或x<&y
完全相同)将 fd x 重定向到与 fd y 上相同的资源)。
cmd >& file
运行时C shell ( csh
) 运算cmd
符的 fd 1 和 2 都连接到新的打开文件描述file
通过以只写模式打开获得。在 Bourne shell 语法中,等价的是cmd > file 2>&1
他们确实发生冲突。实际使用哪一种取决于目标是否是数字。
如果你有:
cmd >&"$file"
$file
如果包含十进制数字序列,则将使用 Bourne shell 运算符,否则将使用 C shell 运算符!
这就是为什么最好避免使用 csh 运算符并使用 Bourne shell 语法 ( > file 2>&1
) 来代替。
bash
(and zsh
) 也有一个&>
运算符作为替代>&
,但请注意,它违反了 POSIX 合规性,因为它本来cmd &> file
是要在 POSIX 中运行的。但它不存在上述冲突问题。cmd &
> file
sh