UbuntuデスクトップでPATHの設定は、~/.bashrc か ~/.bash_profile か ~/.profile のどれに書けばよいのか?

結論

結論から言うと、.bashrc に書くのがいいと思います!

以下解説です。

ログインシェル、対話的シェル、対話的ログインシェル

まずシェルの種類についての説明が必要です。
シェルは大雑把に言うと、ログインシェル、対話的シェル、対話的ログインシェルに分けられます。
下のベン図のような関係です。

f:id:itiut:20130707105353p:plain

ログインシェルとは

ログインしたときに起動するシェルです。
GUIでログインした場合は、表示はされませんが内部的にログインシェルが起動しているんだと思います。

対話的シェルとは

manページによると標準入力と標準エラーがターミナルに接続されているようなシェルです。要は対話的にコマンドを実行するシェルですね。
GUIログイン後に、ターミナルを開いたときに起動するのが、対話的シェルです。

対話的ログインシェルとは

ログインシェルかつ対話的なシェルです。
たぶん、CUIでログインしたときに起動するシェルのことを言っているのだと思います。

まとめると、起動するシェルの種類は次のようになります。

  • CUIでログイン

    → 対話的ログインシェル

  • GUIでログイン

    → 見えないログインシェル

  • GUIでログインしてターミナルを開く

    → 対話的シェル

.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 を使うのはやめました。

参考ページ