>&[FILE_DESCRIPTOR] 与 >& 文件 bash 重定向运算符

>&[FILE_DESCRIPTOR] 与 >& 文件 bash 重定向运算符

我一直在阅读有关 bash 重定向的内容,并遇到了这两篇关于它的文章

如何>&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 &> filesh

相关内容