为什么bash4以不同的方式扩展花括号?
发布时间:2020-12-15 23:00:12 所属栏目:安全 来源:网络整理
导读:其中一个遗留系统升级到bash4,其大部分脚本停止工作.我已经将它缩小到如何在(cmdA ... | cmdB ... file {1,2} | cmdZ ...)内展开花括号. 为了更好地说明差异: 之前(bash 3.2.25): [root@host1:~]$bash -version|head -1GNU bash,version 3.2.25(1)-release
其中一个遗留系统升级到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)控制的,并且可以切换回old / legacy / bash3模式?我宁愿改变一些shell范围的开关(而不是重写一堆脚本). 如果这个(bash3)“功能”在错误修复或改进期间被切断 – 我很惊讶,因为旧的(bash3)语法允许在打字时节省很多… 解决方法
原始行为没有记录(并且与一般规则相反,即包含在进程替换中的代码,如子shell或类似的上下文,以相同的方式进行解析).
因此,这是一个错误,而不是一个功能.这个bug在bash-4.0-alpha中得到修复.引用CHANGES条目:
没有用于还原此更改的运行时标志. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |