シェルを再起動させる簡単な方法

More than 3 years have passed since last update.

開発作業では、ターミナルでシェルってよく使っていますよねー♪ 

僕は zsh を使っています!! シェルは色々カスタマイズしているんですが、通常シェルの設定をした後はファイルを読み込み直したりします。

やり方としては大体以下の感じだと思います。


  1. sourceコマンドで .zshrc などを読み込む

  2. シェルを再ログイン(再起動)して読み込む

今回は 2. シェルの再ログイン について書いてみます。


シェルの再起動方法

一旦 exit してターミナルを立ち上げなおす ということをしていましたが、なんかだるいなーということで調べてみるとありました!!

以下のコマンドを実行することで、ログインシェルから起動したようにシェルを再起動できます!!

exec $SHELL -l

aliasを作ると便利かもしれません。

alias relogin='exec $SHELL -l'

relogin というコマンドで実行できます。

以上!ということで終わりでもいいですが、exec $SHELL -l の意味がよくわからない。。。

シェルの情弱な僕としてはどういう意味なのか気になったのでちょっと調べてみました。


execコマンドについて

UNIXの部屋 コマンド検索:exec (*BSD/Linux) にある説明がとてもわかり易かったので引用します。 exec を使った場合と使わない場合の意味が以下のように書かれていました。

exec ls のコマンドをサンプルに解説されています。



  • exec を使わない場合に関しては以下のとおり書かれています。



  • システムコール fork(2) を呼び、子プロセスを生成する。

  • 子プロセスは ls を exec(2) する。

  • 親プロセスであるシェルは、ls の実行が完了するのを待つ (wait する)。



  • そして exec を使った場合は


シェルは fork(2) せず、いきなり ls コマンドを exec(2) する (シェルの内部コマンド exec(1) を実行すると、内部でシステムコール exec(2) が呼ばれるということ)。シェルのプロセス情報は ls のプロセスの情報で上書きされる。なお、子プロセスは生成されないので、シェルと ls のプロセス ID は同じになる。


要するに通常の exec を使わないコマンドは、コマンド実行時に 子プロセス を起動するということのようです。

実際に exec ls を試してみると、起動中のターミナルのプロセス上で ls が実行され一瞬出力が見えたと思うと、すぐにターミナルのプロセスごと終了してしまいます!


要するに exec $SHELL -l の意味は

$SHELL -l-l オプションは zsh のヘルプを見ると以下の感じになっていました。

シェルをログインシェルで起動するという感じでしょうか!?

-l    equivalent to --login

ということで、、

環境変数 $SHELL をログインシェルから起動させる ことを exec するという意味となり、ターミナルが再起動できるようになります。