[SDKMAN] source ~/.bash_profile 時出現 bad substitution 錯誤

[SDKMAN] source ~/.bash_profile 時出現 bad substitution 錯誤

今天在 source ~/.bash_profile 的時候,出現了這個錯誤訊息:

-bash: ${candidate_name^^}: bad substitution

看了一下 stack trace,

錯誤是來自 SDKMAN 的內部檔案 ~/.sdkman/src/sdkman-path-helpers.sh

ucase_candidate_name="${candidate_name^^}"

^^ 這個語法是 bash 4 以後才支援的,用來把字串轉成大寫。

 

問題在於,目前 shell 的 bash 版本太舊了。

macOS 內建的 /bin/bash 是 3.2 版(因為 bash 4 以後改成 GPLv3,Apple 不想用),

而 ^^ 這個語法需要 bash 4+ 才有支援。

用指令確認一下:

$ echo $BASH_VERSION
3.2.57(1)-release

果然是 3.2!

雖然我有另外透過 Homebrew 安裝 bash 5,

但因為預設的 login shell 還是 /bin/bash,

所以 .bash_profile 是在 bash 3.2 下執行的,就觸發了這個錯誤。

 

解法是把預設的 login shell 改成 bash 5。

1. 確認 bash 5 安裝在哪裡

$ which bash
/usr/local/bin/bash

$ /usr/local/bin/bash --version
GNU bash, version 5.3.15(1)-release (x86_64-apple-darwin23.6.0)

 

2. 把它加到 /etc/shells

chsh 只允許切換到 /etc/shells 裡列出的 shell,所以先把 bash 5 加進去:

echo '/usr/local/bin/bash' | sudo tee -a /etc/shells

 

3. 切換 login shell

chsh -s /usr/local/bin/bash

執行後會要求輸入密碼。

完成後,重新開啟 terminal,

再 source 一次 ~/.bash_profile,錯誤就消失了!

這樣就搞定了,收工!

(本頁面已被瀏覽過 2 次)

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料