結論
$ exec $SHELL -l
背景
bash とかで、シェルだけで再起動したいとき、ウェブで検索すると、大概
$ source ~/.bashrc
とか出てきます。ただ、正確にはこれは再起動していないだろうと。すでにプロファイル情報などが読み込まれているシェルで、新たに~/.bashrc
を読み直してるだけです。
たとえば、下のような形で .bashrc
のなかで定義されていた変数を削除したあとに、上記コマンドを実行しても、その変数は残ったままになるわけです。上記コマンドで、下の代入を取り消したかったら、.bashrc内でexport HOGE=
を書くか、プロンプトで同コマンドを実施する必要があるわけです*1。
export HOGE="fuga"
一度まっさらな状態にして、再度シェルを起動したい場合には冒頭に示したコマンドを実行するか、もうターミナルごと再起動すればいいんじゃないかなと思います。
簡単な解説
exec
コマンドは、現在のプロセス番号のまま(=プロセスをforkせず)、第一引数で渡されたコマンドを新たなプロセスとして起動します。
exec
を付けずに以下のコマンドで起動すると、新たなシェルは別のプロセスとして立ち上がり、exit
したときには元のシェルに戻ってくるわけです。試しに以下のコマンドを実行して、すぐに exit
すると、ログアウトしました
という表示がなされ、元のシェルに戻ってきたことがわかります。
$SHELL -l
第一引数で指定している $SHELL
には、ログインシェル実行ファイルのフルパスが入ります。
$ echo $SHELL /usr/local/bin/bash
また、-l
はbashの起動時にログイン時と同じプロファイル・設定を読んで起動するというオプションになります(個人的にbashしか使っていないため、他のシェルで同様のオプションが -l
で起動するかは定かではないです。また、exec
コマンド自体、bashの組み込みコマンドだったりします)。
実際の挙動は以下の様になります。
$SHELL -l
の時と、exec $SHELL -l
のときで、bashのプロセス数が違うことがわかるはずです。
$ ps aux | grep bas[h] npoi 52344 0.6 0.1 4306456 13072 s002 S 281218 0:05.39 /usr/local/bin/bash -l npoi 3589 0.0 0.0 4305016 6004 s001 S+ 9:40PM 0:00.44 -bash npoi 3150 0.0 0.0 4304404 1156 s003 S+ 8:12PM 0:00.49 -bash npoi 50063 0.0 0.0 4304996 1112 s000 S+ 281218 0:00.85 -bash $ $SHELL -l $ ps aux | grep bas[h] npoi 3589 0.0 0.0 4305016 6004 s001 S+ 9:40PM 0:00.44 -bash npoi 3150 0.0 0.0 4304404 1156 s003 S+ 8:12PM 0:00.49 -bash npoi 52344 0.0 0.1 4306456 13072 s002 S 281218 0:05.42 /usr/local/bin/bash -l npoi 50063 0.0 0.0 4304996 1112 s000 S+ 281218 0:00.85 -bash npoi 8954 0.0 0.1 4304408 12212 s002 S 3:51AM 0:00.37 /usr/local/bin/bash -l $ exit ログアウト $ exec $SHELL -l $ ps aux | grep bas[h] npoi 3589 0.0 0.0 4305016 6004 s001 S+ 9:40PM 0:00.44 -bash npoi 3150 0.0 0.0 4304404 1156 s003 S+ 8:12PM 0:00.49 -bash npoi 52344 0.0 0.1 4304408 11812 s002 S 281218 0:05.79 /usr/local/bin/bash -l npoi 50063 0.0 0.0 4304996 1112 s000 S+ 281218 0:00.85 -bash $
# 本エントリは、2019年1月7日に加筆・修正しました。