bash 历史扩展(带有单词选择)错误地处理了 |& 序列

问题描述 投票:0回答:1

Bash 有两个功能,两者都可以工作,但不能一起使用。

  1. |& 是用于管道 stdout 和 stderr 的替代语法。示例:

    cmd |& tee file
    相当于
    cmd 2>&1 | tee file

  2. 历史表达式允许选择单词,例如

    !*
    除了单词 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 错误吗?除了

之外还有其他解决方法吗
  1. 管道传输时使用 2>&1 语法或
  2. 在执行前编辑历史扩展?

是否有 bash 版本可以解决此问题? 我应该如何/在哪里提交此错误?

(我主要在 Alma 8.9 上使用 GNU bash,版本 4.4.20(1)-release (x86_64-redhat-linux-gnu)。)

bash io-redirection bash4 command-history
1个回答
0
投票

是的,这是一个众所周知的问题,主解析器和历史扩展机制在令牌的构成上不一致。

您可以使用 Bash 套件中的

bashbug
实用程序来提交错误报告,但由于它是已知的,我建议加入 [电子邮件受保护] 邮件列表以进行进一步讨论和反馈。

同时,我强烈建议

shopt -s histverify histreedit
确保在尝试运行它们之前由
!
生成的扩展是您想要的,并允许在扩展失败时重新编辑。

© www.soinside.com 2019 - 2024. All rights reserved.