[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 次)