はじめに
自分がログインシェルの設定をミスったことにより、ターミナルソフトが入力を受け付けなくなったときの話です。
ターミナルソフトは(誤った)設定に従い正常の動作をしたまでで、バグがあったわけではありません。
ただ正直ものすごく焦りました。
現象
- iTerm2
以下のような警告が出て、OKを押すと即終了する状態になりました。メニューバーは触れるものの、コマンドを打つことはできません。
A session ended very soon after starting. Check that the command in profile “Default” is correct.
- Macにデフォルトで入ってるターミナル
「プロセスが完了しました」という表記が出て、メニューバーは触れるものの、コマンドを打つことはできません。
背景と原因
先日、新しいMacBookProを購入したので環境を整えておりました。
自分はログインシェルに zsh を使用しております。ただバージョン管理の点などを考慮し、Mac にデフォルトで入っている zsh ではなく、 Homebrew からインストールした zsh
を使うようにしております。
Homebrew からインストールした zsh
を使うには /etc/shells
にパスを追記し chsh
コマンドで指定する必要があります。
Homebrewでインストールしたzshのパス
% brew --prefix zsh
/opt/homebrew/bin/zsh
ただそこで /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
# このようにパスを追記するはずが...
/opt/homebrew/bin/zsh
# 間違ってこのように追記してしまいました。
/opt/homebrew/opt/zsh
間違えた言い訳としては、この作業の前に git も同じく Homebrew からインストールしたものに変更をしていて、 git のパスがそのディレクトリだったためです。
% brew --prefix git
/opt/homebrew/opt/git
zsh のパスもきちんと確認していたのですが git のパスと同じと見間違い、さらに git のパスはすでにクリップボードにコペーしていたため git のところを zsh に書き換えるだけで流用できると思い込んでいました。
また chsh
コマンドでパスを指定する際にも、自分はまだ間違いに気づいてなかったので、しっかりと間違えたパスを指定してしまいました。
ここで警告は出てたのですが、「デフォルトで入っているシェルではないよ」という意味だと思ったので気にしてませんでした。
% chsh -s /opt/homebrew/opt/zsh
Changing shell for hoge.
Password for hoge:
chsh: WARNING: shell '/opt/homebrew/opt/zsh' is not a regular file
そして自分はログインシェルの設定ができたと思い込んでいるため、ターミナルソフトを再起動したところ、今回の現象が起きました。
直し方
ターミナルソフトには Permission denied
とあったので、許可する必要があるのかと思いました。
ただターミナルソフトにコマンドを打つことはできません。ものすごく焦りました。
ググったところ以下の記事に辿り着き、 Mac デフォルトのターミナルから別のシェルを立ち上げられることを知りました。
記事に従い、メニューバーの「シェル」→「新規コマンド」を押すと、以下のような画面が出てきます。
そこに /bin/zsh
と打ち込むと、 /bin/zsh
を使ってターミナルを立ち上げることができました。歓喜。
ターミナルが入力を受け付けるようになったので、 Homebrew の zsh の調査をしました。
とりあえず(正しいと思っている)パスを直接入力したところ確かに Permission denied
と出ました。
% /opt/homebrew/opt/zsh
zsh: permission denied: /opt/homebrew/opt/zsh
そこでおかしいと思い、もう一度 zsh のパスを確かめたところ、自分がパスの間違いをしていることに気づきました。
そこからは /etc/shells
を修正し、再度 chsh
で設定し直しました。
これで直ると思いきや chsh: no changes made
というレスポンスが返ってきました。
chsh -s /opt/homebrew/bin/zsh
Changing shell for hoge.
Password for hoge:
chsh: no changes made
ただ設定を見直しても今度は正しく設定されています。
またググったところ以下の記事に辿り着きました。
どうやらシステム設定のログインシェルには /opt/homebrew/opt/zsh
と設定されておりました。
ちなみにここが変わらなかった理由は正確にはわかりません。(今回の現象を再現したときには自動で変わりました。)
それを /opt/homebrew/bin/zsh
と直しました。
そしてようやくターミナルソフトは通常通り動くようになり、ログインシェルは Homebrew からインストールした zsh
に変更することができました。
まとめ
深夜に作業するときは、いろいろと気をつけたほうが良いことを学びました。新しいPCを早速壊したと思いとても焦りました。