Bash 为什么>&燃气轮机&;及&燃气轮机>;,但不是>&;及>;?

Bash 为什么>&燃气轮机&;及&燃气轮机>;,但不是>&;及>;?,bash,Bash,从中,在“重定向”部分下: 重定向标准输出和标准错误 此构造允许将标准输出(文件描述符1)和标准错误输出(文件描述符2)重定向到名称为word扩展名的文件 重定向标准输出和标准错误有两种格式: &>话 及 >&话 在这两种形式中,首选第一种 这让我想知道,为什么第一个更受欢迎?我看到&>有效,但>&无效,因此首选项是有意义的。那么为什么>&不起作用呢?这是不明确的吗 这是我正在运行的 $ bash --version GNU bash, version 4.2.46(1)-release (x

从中,在“重定向”部分下:

重定向标准输出和标准错误

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

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

&>话

>&话

在这两种形式中,首选第一种

这让我想知道,为什么第一个更受欢迎?我看到
&>
有效,但
>&
无效,因此首选项是有意义的。那么为什么
>&
不起作用呢?这是不明确的吗


这是我正在运行的

$ bash --version
GNU bash, version 4.2.46(1)-release (x86_64-redhat-linux-gnu)
&>dest
是明确的,而
&dest
看起来像
fdup()
语法…当您有数字文件名时,可以将其解释为
fdup
语法。 自4.1或更高版本以来,Bash允许对
fdup
操作的目标进行参数化——因此,不仅
2>&1
,而且
2>和$stderr\u fd
。将
&
放在
之后,将我们放入用于
fdup()
操作的语法名称空间;事先保持它是明确的

示例:我想将命令
cmd
的stdout和stderr重定向到我的文件中。如果我的文件名为
0
&
会导致问题

  • cmd>&0
    变为
    cmd 1>&0
    。也就是说,将stdout重定向到fd#0
  • cmd&>0
    变成
    cmd>02>&1
    。也就是说,将stdout重定向到名为
    0
    的文件,然后将stderr重定向到fd#1

[n]>&word
是POSIX标准化的<代码>&>word在POSIX标准中找不到。 复制现有文件描述符的唯一形式是
[n]&word
。在语法中,它们被赋予了标记名
GREATAND
LESSAND

对于
&>
&
没有POSIX定义的标记–它们只是常用操作“我不想在屏幕上看到任何东西”或“将stdout和stderr发送到文件”的语法糖。/p p这是很有用的,因为codecmd 2>&1>myFile——对于bash新手来说,这令人惊讶——并没有达到“干净屏幕”的目标,而
cmd>myFile 2>&1
,却可以


所以。。当
>&
不起作用时,
&
为什么起作用?因为写
&>
的人并不觉得有必要制造歧义,而是有意识地选择不允许
&

fdup()。

为了进一步解释为什么
[n]>&word
同义词毫无意义,请记住
>bar
>bar
之间的区别在于
O_APPEND
标志的存在以及
flags
参数中
O_TRUNC
的缺失。但是,当您提供一个文件描述符编号时——从而执行从旧FD编号到新FD编号的
fdup()
——文件已经打开;因此,这些标志无法更改。即使是方向--
vs
GNU bash,3.2.57(1)版发行版(x86_64-apple-darwin17)
上,也不起作用
&
>&
我没有提到我正在阅读手册页的“重定向标准输出和标准错误”部分,这是“重定向”的一小节word是>word 2>&1的语法糖。我要更新我的问题这个问题的语义很微妙。。。
&
&>
的特例执行2个重定向,将stdout和stderr发送到文件。
&
的语法与实际的bash重定向语言
old\u out\u fd>和new\u out\u fd
太相似,因此可能会造成混淆。然而,
&>
,由于其故意的顺序交换,不容易混淆。是的,我同意这些事情是正确的,但我认为答案已经把它们说清楚了。对于
cmd 2>&1>我的文件
,重定向是从左到右处理的;按照这个顺序,首先让fd2指向原始的fd1,然后改变fd1。如果FDs 1和2首先指向同一个目的地,则
2>&1
什么也不做。