【问题标题】:Why bash4 expands curly braces differently?为什么 bash4 以不同的方式扩展花括号?
【发布时间】:2017-08-08 07:44:18
【问题描述】:

其中一个旧系统升级到 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)控制,并且可以切换回旧/旧/bash3 模式?我宁愿更改一些 shell 范围的开关(而不必重写一堆脚本)。

如果这个(bash3)“功能”在错误修复或改进期间被切断 - 我很惊讶,因为旧的(bash3)语法允许在打字时节省大量......

【问题讨论】:

  • 哦,等等。您希望生成两个不同的进程替换,而不是sed 的两个参数?我不知道那是曾经符合正确的,记录在案的行为......也就是说,AFAIK,你的代码取决于一个错误。
  • @CharlesDuffy - 在 bash4 升级之前,它一直是这样工作的(对我和脚本来说) - &lt;(cmd {a,b}) 确实扩展到两个 &lt;(cmd a) &lt;(cmd b) 并被传递到 join/etc。那些脚本广泛使用此功能,将其嵌套到多个级别并测试脚本(不想用我的胖手指触摸它并产生新的错误)。
  • @Vlad 这似乎是一个错误,他们在 Bash 4 中修复了。您应该期望 &lt;(...) 中的命令与任何其他命令一样被解析,所以 &lt;(cmd {a,b}) 应该等同于&lt;(cmd a b).
  • 这种误解是我欣赏 Rich Hickey 在 Clojure 中的政策的地方之一,明确而大声地宣称虽然保证了文档功能的向前兼容性,但在任何情况下都不会是可以依赖的无证行为。

标签: bash shell rhel curly-braces expansion


【解决方案1】:

原始行为未记录(并且与包含在进程替换中的代码(如子外壳或类似上下文)以与在其外部行为相同的方式进行解析的一般规则相反)。

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

rr。大括号扩展现在允许进程替换不变地通过。

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

【讨论】:

  • 我同时朝同一个方向挖掘,找到了另一个受影响的用户 (wiki.bash-hackers.org/syntax/expansion/brace),然后在 CHANGES 和所有导致“提交 bash-20080724 快照”的 git 提交中找到了相同的条目.为了简单起见 - 我将为我的盒子重新编译自定义 bash4,同时只恢复优先级更改,然后重新检查脚本。遗憾的是,它没有暴露于运行时标志以简化我的目标。让我为所有答案投票,谢谢!
猜你喜欢
  • 2011-05-02
  • 2012-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-29
  • 2014-04-18
相关资源
最近更新 更多