macOS: 使用 Homebrew 的 Z shell (zsh) 作為預設 shell

雖然說 macOS 作業系統內建許多 shell 環境, 除了過去常用的 csh, tcsh, bash 等 shell 之外, 其中也包含了 zsh 這個命令列環境, 而自從 macOS Catalina (10.15) 開始, macOS 也將 zsh 這個 shell 做為使用者帳號預設的命列環境。 但是, 自己常常被果粉問到, 裝了 Homebrew 之後就想要使用她維護的 zsh 做為預設的 shell , 可是使用 chsh -s 這個指令進行切換時, 卻碰到 chsh: /usr/local/bin/zsh: non-standard shell 這種錯誤, 讓自己身邊的果粉不曉得該怎麼辦?

知其所以然

一般而言, UN*X (*nix, Unix-like) 類的作業系統, 對於使用者利用 chsh -s 指令設定自己預設使用的 shell 環境時, 有一定的安全機制保護, 避免使用者誤用了未經系統管理員認可的 shell 環境, 對系統造成危害。 這個安全機制就是位於 /etc 目錄下的 shells 檔案, 所有經過系統管理員認可的 shell 環境, 都會載明於該檔案中。

macOS 作業系統 /etc/shells 檔案中, 預設為以下的內容 (以 macOS Monterey, version 12 為例) :

➜  ~ more /etc/shells
# List of acceptable shells for chpass(1).
# Ftpd will not allow users to connect who are not using
# one of these shells.

/bin/bash
/bin/csh
/bin/dash
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh

以上這些 shell 都是作業系統認可的標準 shell 環境, 所以當身邊的果粉嘗試使用 chsh -c 設定 Homebrew 所安裝的 zsh 時, 自然就會收到 non-standard shell 這種錯誤而無法完成設定了。 (聰明人看到這裡應該已經知道該怎麼繞過這個安全機制了吧!)

知其然 (其一)

假設自己就是一位認真負責的系統管理員, 而 Homebrew 所安裝的 zsh 也通過自己嚴格的安全審核後, 取得認證可以做為系統中其他使用者的預設 shell 環境, 那麼標準的作法就是:

  1. 將 Homebrew 所安裝的 zsh 加入 /etc/shells 檔案中
  2. 讓系統中的用戶可以使用 chsh -s 自行切換自己所偏好的 shell 環境 (包含步驟 1 所加入的 Homebrew 版本 zsh)

因此, 果粉們就可以使用下列指令範例進行 shell 環境設定:

➜  ~ sudo su -l
Password:
# echo "/usr/local/bin/zsh" >> /etc/shells
# exit
➜  ~ chsh -s /usr/local/bin/zsh
Password:
➜  ~

這樣就不會被 chsh: /usr/local/bin/zsh: non-standard shell 錯誤所困擾, 也可以享受走在技術環境前沿的樂趣, 這裡順便比較此文最後修該當下的版本資訊:

➜  ~ /bin/zsh --version
zsh 5.8 (x86_64-apple-darwin21.0)
➜  ~ /usr/local/bin/zsh --version
zsh 5.8.1 (arm-apple-darwin21.3.0)

不能說追求最新穎的版本有甚麼問題或錯誤, 只是如果是勸得動的果粉, 自己都會跟他們解釋前因後果之後, 順便提供如果一個東西用的好好的, 也不知道那個東西有甚麼地方有問題或是不足, 不知為何而換地把那個東西換掉, 有時候也不見得是一個好的做法, 給果粉們參考。

參考資料

發佈留言

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