テストコマンド [ -t 1 ]
はbashの出力が端末であるかどうかをチェックします。この行の目的は、bashの他の使用を中断することなく、ターミナルを開くときにzshを実行することです。しかし、それは非常に悪いことです。
ファイル.bashrc
は次の3つの状況で読み取られます。
- bashが対話型シェルとして実行される場合、つまり、バッチコマンドを実行するのではなく、ユーザーが入力したコマンドを実行する場合。
- bashがRSHまたはSSHデーモンによって実行される非対話型シェルである場合(通常、実行
ssh host.example.com somecommand
していてbashがログインシェルであるためhost.example.com
)。
- ユーザーの場合など、明示的に呼び出されたとき
.bash_profile
(bashのスタートアップファイルの選択は少し奇妙です)。
[ -t 1 ]
対話型シェルを検出する方法としては不十分です。端末に行かずに標準出力でbashを対話的に実行することは可能ですが、まれです。標準出力を非対話式シェルの端末に送るのがより一般的です。非対話型シェルには実行中のビジネスはありません.bashrc
が、残念ながらSSHによって呼び出されるbashシェルは実行します。より良い方法があります:bash(および他のshスタイルのシェル)は、それを行うための信頼できる組み込みの方法を提供します。
case $- in
*i*) echo this shell is interactive;;
*) echo this shell is not interactive;;
esac
したがって、「これが対話型シェルである場合はzshを起動する」と記述する必要があります
case $- in
*i*) exec zsh;;
esac
しかし、それでも良い考えではありません。これは、bashシェルを開くことを防ぎます。これは、zshを使用している場合でも便利です。このブログ投稿を忘れて、代わりにターミナルを開いてbashの代わりにzshを実行するショートカットを設定するだけです。「WindowsでBashアプリケーションを開くたびに、Zshシェルで起動する」ように整理しないでください。zshが必要な場合は、Zshアプリケーションを開きます。
bash
読み取ることができます.bashrc
インタラクティブ(のようにssh host cmd
ここでbash
ホスト上のユーザのログインシェルであり、又はbash --login -c 'some code'
ここ.bash_profile
源.bashrc
)。case $- in *i*)...
シェルがインタラクティブかどうかをテストする正しい方法です。