Bash 5.0 發布部分功能與4.4 不兼容
Unix Bash放出第5個主要版本,這個版本主要修復了Bash 4.4中幾個明顯的錯誤,同時也加入了一些新功能。Bash是一個完整的POSIX規範項目,除了有交互式命令列編輯功能,還在基架構上支援工作控制,並提供類似csh的功能等。
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
- 檢查現有的bash版本
bash --version
。 - 使用brew安裝bash
brew install bash
。
由於MacOS 禁止更改系統目錄權限,並引入sip 機制,所以需要先關閉sip,修改bash 相關設置,再打開sip 。
- 重啟MacOS ,開機時按住
Command+R
。 - 出現界面之後,選擇Utilities menu 中Terminal 。
- 在Terminal中輸入
csrutil disable
關閉SIP。 - 重啟MacOS
- 加入軟連接
sudo mv /bin/bash /bin/bash.origin sudo ln -s /usr/local/bin/bash /bin/bash
- 重啟電腦,開機時按住
Command+R
。 - 出現界面之後,選擇Utilities menu 中Terminal 。
- 在Terminal中輸入
csrutil enable
打開SIP。
更新截圖: