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