查看原文
其他

Bash 5.0 发布及其新功能

译者/geekpi Linux爱好者 2019-04-02

(给Linux爱好者加星标,提升Linux技能


英文:Ankush Das,翻译:Linux中国/geekpi

linux.cn/article-10477-1.html


邮件列表证实最近发布了 Bash-5.0。而且,令人兴奋的是它还有新的功能和变量。


如果你一直在使用 Bash 4.4.XX,那么你一定会喜欢 Bash 的第五个主要版本。


第五个版本侧重于新的 shell 变量和许多重大漏洞修复。它还引入了一些新功能,以及一些与 bash-4.4 不兼容的更改。



新功能怎么样?


在邮件列表解释了此版本中修复的 bug:


此版本修复了 bash-4.4 中的几个主要错误,并引入了几个新功能。最重要的 bug 修复是对 nameref 变量的解析以及通过模糊测试发现的许多潜在的内存越界错误。在为了符合 Posix 标准解释而不进行单词拆分的上下文中,对 $@ 和 $* 的展开做了许多改变,另外还有解决极端情况中 Posix 一致性的修改。


它还引入了一些新功能。根据其发布说明,最值得注意的新功能是几个新的 shell 变量:


BASH_ARGV0、EPOCHSECONDS 和 EPOCHREALTIME。内置命令 history 可以删除指定范围的条目,并能将负数理解为从历史末端开始的偏移量。有一个选项允许局部变量继承前一个范围内具有相同名称的变量的值。有一个新的 shell 选项,在启用它时,会导致 shell 只尝试一次扩展关联数组下标(这在算术表达式中使用时会出现问题)。globasciiranges 这个 shell 选项现在默认启用。可以在配置时默认关闭它。


Bash-4.4 和 Bash-5.0 之间有哪些变化?


其更新日志提到了不兼容的更改和所支持的 readline 版本历史记录。它是这么说的:


bash-4.4 和 bash-5.0 之间存在一些不兼容的变化。尽管我已经尽量最小化兼容性问题,但是对 nameref 变量解析的更改意味着对变量名引用的某些使用会有不同的行为。默认情况下,如果启用了扩展调试模式,shell 仅在启动时设置 BASH_ARGC 和 BASH_ARGV。它被无条件地设置是一个疏忽,并且在脚本传递大量参数时会导致性能问题。


如果需要,可以将 Bash 链接到已安装的 Readline 库,而不是 lib/readline 中的私有版本。只有 readline-8.0 及更高版本能够提供 bash-5.0 所需的所有符号。早期版本的 Readline 库无法正常工作。


我相信一些添加的功能/变量非常有用。我最喜欢的一些是:


  • 有一个新的(默认情况下禁用,文档中没有说明)shell 选项,用于在运行时启用/禁用向 syslog 发送历史记录。

  • 正如文档一直所说的那样,除非 shell 处于调试模式,否则它不会在启动时自动设置 BASH_ARGC 和 BASH_ARGV,但如果脚本在上层引用它们且没有启用调试模式,那么 shell 将动态创建它们。

  • 现在可以使用 -d start-end 删除指定范围的 history 条目。

  • 如果启用了作业控制的非交互式 shell 检测到前台作业因 SIGINT 而死亡,则其行为就像接收到 SIGINT 一样。

  • BASH_ARGV0:一个新变量,扩展为 $0,并在赋值时设置为 $0。


总结


你可以使用下面的命令检查你当前的 Bash 版本:


bash --version


你很可能安装了 Bash 4.4。如果你想获得新版本,我建议等待你的发行版提供它。


你怎么看待 Bash-5.0 发布?你在使用其他 bash 的替代品么?如果有的话,这个更新会改变你的想法么?



推荐阅读

(点击标题可跳转阅读)

献给命令行重度用户的实用 BASH 脚本

面向系统管理员的 Bash 指南

高效编写 Bash 脚本的 10 个技巧



看完本文有收获?请分享给更多人

关注「Linux 爱好者」加星标,提升Linux技能

喜欢就点一下「好看」呗~

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存