其中一个遗留系统已升级到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)语法允许在打字时节省很多...
答案 0 :(得分:4)
原始行为没有记录(与一般规则相反,即在进程替换中包含的代码,如子shell或类似的上下文,以相同的方式进行解析)。
因此,这是一个错误,而不是一个功能。这个bug在bash-4.0-alpha中得到修复。引用CHANGES条目:
RR。现在,支撑扩展允许流程替换不变。
没有可以恢复此更改的运行时标志。