新潟の空は今日も灰色/東京の空は今日も青空

知識も技術も文章力もないので練習しています。新潟から東京へ移住しました。

bash を再起動

結論

$ 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

また、-lbashの起動時にログイン時と同じプロファイル・設定を読んで起動するというオプションになります(個人的に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日に加筆・修正しました。

*1:当然ながら、これだと環境変数HOGEは消えてしまうので、/etc/.profileなどで設定されていた場合などは、その設定値も消えてしまいます。