.bash_profileに「exec /bin/zsh」と書くのはやめたほうがいい

zsh を使いたいが、ログインシェルにするのはちょっと怖い…。
.bash_profile に

exec /bin/zsh

と書いて代用する、というのはよく使われるテクニックですが、実はこの記述だと /bin/zsh が消えてしまった場合にログインできなくなります。

[ -x "/bin/zsh" ] && exec /bin/zsh

だと /bin/zsh が消えたときには exec が行われなくなるので、安全です。

… と思って使っていたのですが、先ほど自分のサーバを再起動したら帰ってこなくなりました。

exec /bin/zsh を .bash_profile に書くと mdmonitor が起動しない (CentOS 5.5) - Kenichi Maehashi's Blog

この記述をしてる人は多そうだけど、やめといたほうがいいと思われる。
自分もこれのせいでハマった一人。

なぜ?

まず、zshでもshでもなくbashを立ち上げたい時にめんどくさいこと。
次に、/bin/shbashである場合、シェルスクリプトなどのshebangに「#!/bin/sh」と書いてあった場合にzshで解釈されてしまうこと。
id:kmaehashiさんからシェルスクリプトを実行する場合は非インタラクティブモードで動作するのでそのようなことはないと教えていただきました(コメント参照)。
最後に、そのような環境を想定したプログラムは多分ほとんどないだろうと思われること。
これについては最後の項でそのような「想定していないプログラム」が引き起こした具体的なトラブルについて列挙します。

解決策

もしあなたがこの記述を「zshは不安定そうだから」という理由からしているのだとしたら杞憂だと思う。
また「zshがインストールされていたらzsh、されていなかったらbashという風にしたい。わざわざシェルを変更したくない」
という理由だったら、設定なんて一瞬で済むだろうし、おそらく両者の違いにはすぐ気付くだろうから設定し忘れるということもないと思う。
というか設定し忘れるくらい気にしてないんだったらどっち使っても同じだろうし。

ようするに、解決策としては素直にデフォルトシェル変えましょう、と。

もうちょっと説得

これにまつわるトラブルを冒頭で引用した人のような方法で対処することはできると思います。
しかしそもそも「$SHELLにbashを指定してるのに実際のシェルはzsh」というのは
$SHELLを参照するプログラムなどからすれば想定できない環境であり、
何が起こってもおかしくないと僕は思います。

この記述のせいで起こったいくつかのトラブル