Bash 5.0 發佈 部分功能與 4.4 不兼容

Unix Bash 放出第 5 個主要版本,這個版本主要修復了Bash 4.4 中幾個明顯的錯誤,同時也加入了一些新功能。Bash 是一個完整的POSIX 規范項目,除了有交互式命令列編輯功能,還在基架構上支援工作控制,並提供類似csh的功能等。

Bash 5.0 發佈 部分功能與 4.4 不兼容

Bash 5.0 主要解決 Bash 4.4的錯誤,改變對nameref解析的方法,和一系列以模糊測試發現的潛在查出范圍的錯誤。另外,Bash 5.0 在不執行字符拆解以符合Posix標準解釋的情況下,在不同的上下文中,$@和$*的擴充也有許多改變,而且還解決不少極端案例以增加Posix的一致性。

而本次最重要的功能更新,是增加了新的環境變量,BASH_ARGV0、EPOCHSECONDS和EPOCHREALTIME。而內建的 History 功能現在可以用來刪除歷史數據的范圍,並且將負的參數作為歷史列表末端的偏移量。Bash 5.0還增加了一個選項,允許區域變量集成前一個作用域中,具有相同名稱的變量名。

另外,還加入一個新的選項,啟用後將允許 shell 只嘗試 擴展開始下標(Subscripts)一次,但官方表示,這個功能在數學表達式中仍會出現使用問題。Bash 5.0現在會預設啟用globasciiranges 選項,使用者可以在配置階段將其設定為預設關閉。

官方提醒,Bash 4.4和Bash 5.0之間存在部分不兼容的更新,像是 nameref 解析方法的更新,代表着使用 namerefs 會出現不同的行為,盡管官方提到他們已經盡可能減少這種兼容性問題,但仍有部分無法避免。除此之外,現在在預設情況下,當啟用擴充模式的時候, shell 才會啟動配置BASH_ARGC和BASH_ARGV,官方表示,這是一個之前的設置定疏忽,在傳遞大量參數時,會造成效率低下的問題。

官方建議使用者可以將 Bash 連接到已安裝的 Readline 庫,而非使用 lib/readline 中的版本,因為只有 Readline 8.0 以及以上版本,才能提供所有Bash 5.0需要的字符,使用早前的 Readline 庫版本將無法正常運行。

升級至 Bash 5.0

  1. 檢查現有的 bash 版本 bash --version

  2. 使用 brew 安裝 bash brew install bash

由於 MacOS 禁止更改系統目錄權限,並引入 sip 機制,所以需要先關閉sip,修改 bash 相關設置,再打開 sip 。

  1. 重啟 MacOS ,開機時按住 Command+R

  2. 出現界面之後,選擇 Utilities menu 中 Terminal 。

  3. 在Terminal 中輸入 csrutil disable 關閉SIP。

  4. 重啟 MacOS

  5. 加入軟連接

sudo mv /bin/bash /bin/bash.origin sudo ln -s /usr/local/bin/bash /bin/bash
  1. 重啟電腦,開機時按住 Command+R

  2. 出現界面之後,選擇 Utilities menu 中 Terminal 。

  3. 在Terminal 中輸入 csrutil enable 打開 SIP。

更新截圖:

Bash 5.0 發佈 部分功能與 4.4 不兼容

來源:cnBeta