UbuntuデスクトップでPATHの設定は、~/.bashrc か ~/.bash_profile か ~/.profile のどれに書けばよいのか?
結論
結論から言うと、.bashrc
に書くのがいいと思います!
以下解説です。
ログインシェル、対話的シェル、対話的ログインシェル
まずシェルの種類についての説明が必要です。
シェルは大雑把に言うと、ログインシェル、対話的シェル、対話的ログインシェルに分けられます。
下のベン図のような関係です。
ログインシェルとは
ログインしたときに起動するシェルです。
GUIでログインした場合は、表示はされませんが内部的にログインシェルが起動しているんだと思います。
対話的シェルとは
manページによると標準入力と標準エラーがターミナルに接続されているようなシェルです。要は対話的にコマンドを実行するシェルですね。
GUIログイン後に、ターミナルを開いたときに起動するのが、対話的シェルです。
対話的ログインシェルとは
ログインシェルかつ対話的なシェルです。
たぶん、CUIでログインしたときに起動するシェルのことを言っているのだと思います。
まとめると、起動するシェルの種類は次のようになります。
.bashrc
などの設定ファイルの読み込み順
ログインシェルの場合
manページによると、~/.bash_profile
、~/.bash_login
、~/.profile
の順に探して、最初に発見したファイルだけを読み込みます。
ただしここで注意すべきことは、UbuntuデスクトップでGUIでログインした場合は、~/.bash_profile
, ~/.bash_login
を読み込みません。なので、~/.profile
だけを読み込もうとします。
対話的シェルの場合
~/.bashrc
を読み込みます。
対話的なログインシェルの場合
上記の両方の動作をしますが、その順番については調べてません。
どのファイルにPATHの設定を書くべきか
Ubuntuデスクトップの場合を考えると、ログインしたときに、1度だけ ~/.profile
が読み込まれ、ターミナルを開いたときに、毎回 ~/.bashrc
が読み込まれることになります。
PATHの設定を動的に変えたいなんてことは多分珍しいことなので、実行のコストを考えると、ログイン時に設定を済ませればいいかもしれません。
しかしUbuntuのドキュメントによると、ターミナルの起動時にはBashをforkして実行するオーバーヘッドが支配的なので、~/.bashrc
で毎回PATHを設定するコストは無視できるとあります。
実行コストの面ではどちらでもよいと考えれられるので、他の視点から考えます。
僕に限らず、設定ファイルをGitで管理して、複数の環境で共有している人は少なくないと思います。
この場合、Ubuntuデスクトップ以外の環境でも設定を共有しようと思ったときに、できるだけ環境に依存しない設定の仕方をしたいです。
例えば、WindowsでGit Bashを使おうと思ったときに、~/.profile
は読み込まれません。
WindowsでGit Bashを起動したときは、~/.bash_profile
も ~/.profile
も読み込まれました。しかも、~/.bash_profile
が優先されていました。
しかし、~/.bashrc
がなく、~/.bash_profile
だけある場合に、~/.bash_profile
が2回読み込まれる原因不明の動作が起きました。
以上より、結論としては、一番環境に依存せず、Bashの起動時に毎回読み込まれる ~/.bashrc
に設定を書いておくのがいいと思いました。
補足など
~/.bashenv
もしくは ~/.zshenv
~/.bashenv
も ~/.bashrc
同様、Bashの起動時に毎回読み込まれるみたいなことをネットで見かけたのですが、manページにもUbuntuのドキュメントにもなかったので、あまり調べてません。
~/.bashenv
ではなく、~/.zshenv
だとどうなるか試したのですが、僕の Zsh + byobu-tmux の環境では、Byobu Terminalの起動時に ~/.zshenv
が2回読み込まれてしまったため、~/.zshenv
を使うのはやめました。
~/.pam_environment
について
Ubuntuのドキュメントによると、~/.bashrc
や ~/.profile
に環境変数の設定を書くよりも、~/.pam_environment
に書くことが推奨されています。
このファイルは ~/.bashrc
などと違い、source
コマンドによって読み込めないので、変更を適用するのに再度ログインし直す必要があります。
一度試してみたのですが、PATHの記述を間違えてしまい、ログイン画面でユーザー名とパスワードを入れてもログインできずに、同じ画面にまた戻るという現象が起きてしまいました。
リカバリモードでログインして、~/.pam_environment
を削除することで事なきを得ましたが、ログインし直さなければ記述の間違いを発見できないというのは、間違ったときに致命的です。
また、Linux環境に特有の設定ファイルなので、やはり前述の理由から、~/.pam_environment
を使うのはやめました。