web-dev-qa-db-ja.com

chshまたは管理者権限なしでデフォルトのシェルを変更する

私はこのスレッドで次のスニペットを見ました: デフォルトのシェルとしてcshからbashに変更する方法

sleep 2
if (-x /usr/local/bin/bash) then
  exec /bin/sh -c '. ~/.profile; exec /usr/local/bin/bash'
endif

私の理解では、このスニペットを~/.loginログインするとbashが呼び出されます。

同様のスニペットを使用して、ログインに使用するデフォルトのバージョンとは異なるバージョンのzshを呼び出したいという同様の状況があります。この問題が発生する理由の一部は、 zshで許可されているオプションでchshの希望するバージョンを選択できず、管理者権限がないためです。

これとともに:

  • 異なるバージョンのzshを切り替えるときに、上記のスニペットを変更するにはどうすればよいですか?
  • 上記のスニペットに2つのexecコマンドが必要なのはなぜですか?彼らは何をしますか?また、上記のスニペットがshbashを使用するのはなぜですか(ユーザーはcshでログインする必要があります)

Bashの代わりにzshを実行する場合は、/usr/local/bin/bashzsh実行可能ファイルへのパスに置き換えます。このスニペットはcshに固有のものであることに注意してください。ログインシェルが(t)cshでない場合、~/.loginのこのコードは何もしません。

スニペットがそのように書かれた理由については、それを書いた人に尋ねる必要があります。 [それが誰であったかをチェックします。]ああ。まあ、exec /usr/local/bin/bashだけを実行すると、ログインシェルが開始されないため、.profileは実行されません。しかし、これは/usr/local/bin/bash --loginを実行することにより、より簡単な方法で解決できます。

ここで、ログインシェルがcshではない場合、execの周りに別のスニペットが必要になります。 zshを含むBourneスタイルのシェル:

if [ -x ~/bin/zsh ]; then exec ~/bin/zsh; fi

Zshの新しいインスタンスでexec ~/bin/zsh -lを読み取る場合は、~/.zprofileにしてください。その場合は、上記のスニペットが.profileまたは.bash_profileに含まれている必要があります。ログインシェルがzshの場合、.zprofileにスニペットを入れないでください。または、zshの新しいインスタンスがexecを再び呼び出さないようにしてください。