一个遗留系统升级到bash4,它的大多数脚本停止工作。我已经将范围缩小到如何在<(cmdA ...|cmdB ... file{1,2}|cmdZ ...)中扩展花括号。
为了更好地说明这种差异:
之前(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)控制的,并且可以切换回旧/旧/bash 3模式吗?我宁愿更改一些shell范围的开关(而不是重写一堆脚本)。
如果这个(bash3)“特性”是在错误修复或改进过程中被切断的-我很惊讶,因为旧的(bash3)语法允许在输入时节省一吨.
发布于 2017-03-16 22:33:40
最初的行为是无文档化的(与包含在进程替换中的代码(如子subshell或类似上下文)的一般规则相反,解析方式与它在进程替换之外的行为方式相同。
因此,这是一个bug,而不是一个特性。这个错误是在bash-4.0-alpha中修复的。引用更改条目:
rr.支撑扩展现在允许进程替换不改变通过。
没有恢复此更改的运行时标志可用。
https://stackoverflow.com/questions/42845853
复制相似问题