为什么bash4以不同的方式扩展花括号?

时间:2017-03-16 22:21:55

标签: bash shell rhel curly-braces expansion

其中一个遗留系统已升级到bash4,其大多数脚本都停止工作。我把它缩小到如何在<(cmdA ...|cmdB ... file{1,2}|cmdZ ...)范围内扩展大括号。

更好地说明差异:

BEFORE(bash 3.2.25):

[root@host1:~]$ bash -version|head -1
GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu)
[root@host1:~]$ cat <(echo sort file{1,2})
sort file1
sort file2
[root@host1:~]$ join <(sed 's/\r//g;s/^[^:]*://' file{1,2}|LANG=C sort)
[root@host1:~]$

之后(bash 4.1.2):

[root@host2:~]$ bash --version|head -1
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
[root@host2:~]$ cat <(echo sort file{1,2})
sort file1 file2
[root@host2:~]$ join <(sed 's/\r//g;s/^[^:]*://' file{1,2}|LANG=C sort)
join: missing operand after `/dev/fd/63'
Try `join --help' for more information.
[root@host2:~]$ 

是否为bash4做出了“硬编码”(并预期?)更改?或者此扩展的行为是否受某些bash级别设置(如set -B / set +B)的控制,并且可以切换回旧版/旧版/ bash3模式?我宁愿改变一些shell范围的开关(而不是重写一堆脚本)。

如果在修正或修改过程中这个(bash3)“功能”被切断了 - 我很惊讶,因为旧的(bash3)语法允许在打字时节省很多...

1 个答案:

答案 0 :(得分:4)

原始行为没有记录(与一般规则相反,即在进程替换中包含的代码,如子shell或类似的上下文,以相同的方式进行解析)。

因此,这是一个错误,而不是一个功能。这个bug在bash-4.0-alpha中得到修复。引用CHANGES条目:

  

RR。现在,支撑扩展允许流程替换不变。

没有可以恢复此更改的运行时标志。