为什么 bash4 以不同方式扩展花括号?
Why bash4 expands curly braces differently?
其中一个遗留系统已升级到 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:~]$
这是 "hard-coded"(和预期的?)对 bash4 所做的更改吗?或者这个扩展的行为是由一些 bash 级别的设置控制的(比如 set -B
/set +B
)并且可以切换回 old/legacy/bash3 模式?我宁愿更改一些 shell 范围的开关(而不是必须重写一堆脚本)。
如果这个 (bash3) "feature" 在错误修复或改进期间被切断 - 我很惊讶,因为旧的 (bash3) 语法允许节省大量在打字...
原始行为没有记录(并且与一般规则相反,即包含在进程替换中的代码,如子 shell 或类似的上下文,以相同的方式解析它在相同之外的行为)。
因此,这是一个错误,而不是一个功能。此错误已在 bash-4.0-alpha 中修复。引用 CHANGES 条目:
rr. Brace expansion now allows process substitutions to pass through unchanged.
没有可用的运行时标志来还原此更改。
其中一个遗留系统已升级到 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:~]$
这是 "hard-coded"(和预期的?)对 bash4 所做的更改吗?或者这个扩展的行为是由一些 bash 级别的设置控制的(比如 set -B
/set +B
)并且可以切换回 old/legacy/bash3 模式?我宁愿更改一些 shell 范围的开关(而不是必须重写一堆脚本)。
如果这个 (bash3) "feature" 在错误修复或改进期间被切断 - 我很惊讶,因为旧的 (bash3) 语法允许节省大量在打字...
原始行为没有记录(并且与一般规则相反,即包含在进程替换中的代码,如子 shell 或类似的上下文,以相同的方式解析它在相同之外的行为)。
因此,这是一个错误,而不是一个功能。此错误已在 bash-4.0-alpha 中修复。引用 CHANGES 条目:
rr. Brace expansion now allows process substitutions to pass through unchanged.
没有可用的运行时标志来还原此更改。