Nhìn vào đây để giải thích tuyệt vời và giải pháp được đăng bởi @ mkuity0 [liên quan đến bashvấn đề nâng cấp.
Tôi đã gặp một vấn đề tương tự khi làm ngược lại trên hệ thống của mình (OS X 10.10.1): tạo bashlại vỏ đăng nhập mặc định sau khi tôi đã cài đặt oh-my-zsh, làm zshmặc định, sau đó nâng cấp bashtừ 3.2.53 lên 4.3.30 bằng Homebrew ( Tại sao Apple vận chuyển Yosemite với bashphiên bản cũ ?).
Tôi nghĩ rằng SHELLbiến môi trường phản ánh nhưng không kiểm soát vỏ đăng nhập mặc định thực tế cho người dùng. Ví dụ: nếu, giả sử, bashlà mặc định của bạn và bạn mở một bashcửa sổ shell mới từ terminal thì $ export SHELL="/bin/zsh"; echo "$SHELL"sẽ hiển thị /bin/zshnhưng sẽ không có thay đổi thực sự bởi vì nếu bạn mở một cửa sổ shell mới từ terminal và $ echo $0bạn sẽ thấy -bash( $0chứa tên và đường dẫn của lệnh đã khởi động cửa sổ shell, trong trường hợp này bashvà -bên cạnh nó chỉ ra rằng đó là một vỏ đăng nhập).
Như @ mkuity0 đã chỉ ra vỏ đăng nhập mặc định thực tế cho người dùng được kiểm soát bởi thuộc UserShelltính trong hồ sơ người dùng trong cơ sở dữ liệu nội bộ của hệ thống - điều này có thể được truy vấn và cập nhật bằng tiện ích dòng lệnh dscl. Thông tin này sẽ được chuyển đến ứng dụng đầu cuối của bạn khi bạn mở một cửa sổ shell.
Điều gì chsh -s /bin/zshlàm thay đổi thuộc UserShelltính này để đặt nó thành zsh- bạn có thể kiểm tra điều này bằng cách thực hiện dscl . -read /Users/$USER/ UserShellngay sau đó, và bạn sẽ thấy UserShell: /bin/zsh. Nhưng thay đổi không được thực hiện trong cửa sổ hiện tại, cho đến khi bạn làm điều gì đó như được exec su - $USERđề xuất bởi @ mkuity0 hoặc cho đến khi bạn đóng và mở một cửa sổ shell.
/etc/shellschưa? Hướng dẫn quy định rằng nếu shell bạn chỉ định không có trong tệp đó, thì nó không được coi là shell tiêu chuẩn.