Bash 有两个功能,两者都可以工作,但不能一起使用。
|& 是用于管道 stdout 和 stderr 的替代语法。示例:
cmd |& tee file
相当于 cmd 2>&1 | tee file
! 历史表达式允许选择单词,例如
!*
除了单词 0 之外的所有单词(也可以写为 !:*
)。示例:
echo one two
echo zero !*
第二个回声产生
echo zero one two
到目前为止,一切都很好。但当组合起来时,bash 会做错事。
echo one |& tee /tmp/file
one
echo zero !*
echo zero one | & tee /tmp/file
bash: syntax error near unexpected token `&'
(“one”行和以“bash:”开头的行是输出,并且行 回声零一| & 三通/tmp/文件 是历史重申它生成的扩展并出现,因为我启用了
histexpand
选项(与 set -H
相同)。)
请注意,历史扩展在 | 和 & 之间插入了一个空格。这没有帮助,而且在我看来,这是不正确的。我希望
|&
有向图保留在一起,所以扩展应该是echo zero one |& tee /tmp/file
|&
序列。)
这是一个已知的 bash 错误吗?除了
之外还有其他解决方法吗是否有 bash 版本可以解决此问题? 我应该如何/在哪里提交此错误?
(我主要在 Alma 8.9 上使用 GNU bash,版本 4.4.20(1)-release (x86_64-redhat-linux-gnu)。)
是的,这是一个众所周知的问题,主解析器和历史扩展机制在令牌的构成上不一致。
您可以使用 Bash 套件中的
bashbug
实用程序来提交错误报告,但由于它是已知的,我建议加入 [电子邮件受保护] 邮件列表以进行进一步讨论和反馈。
同时,我强烈建议
shopt -s histverify histreedit
确保在尝试运行它们之前由 !
生成的扩展是您想要的,并允许在扩展失败时重新编辑。