質問: bash起動直後の`PATH`が重複エントリを含まないようにしたいと考えています。そのために次のようなコードを使って`PATH`から重複を削除しようと思うのですが、これはどこに置くべきでしょうか? ``` PATH=$(echo "$PATH" | awk -v RS=':' '!a[$1]++ { if (NR > 1) printf RS; printf $1 }') ``` 特に * このコードの実行からユーザの入力を受け付けるようになるまでに`PATH`が変更されない。 * 必ずこのコードが実行される。 という2条件を満たして欲しいのですがどうすればよいでしょうか。
回答: ご質問の2条件を満たす機能は(おそらく)ないと思いますので、起動ファイルについて理解したうえで `~/.bash_profile` や ~/.bashrc を記述する必要があります。 bash 起動時の動作は `man bash` をご覧いただくとして 起動時に読み込まれるファイルは次のようになっています。 **ログインシェルの場合** 1. /etc/profile 2. ~/.bash_profile or ~/.bash_login or ~/.login **非ログインシェルで対話的に起動した場合** 1. ~/.bashrc また、上記のファイル内で明示的に読み込まれているファイルも有ったりします。手元のcentosだと次のようになってます。 1. /etc/profile.d/*.sh : /etc/profile の中で読み込んでる 2. /etc/bashrc : ~/.bashrc の中で読み込んでる ※また、~/.bash_profile の中で ~/.bashrc を明示的に読み込んでました。 以上のようにログインシェルか否かで読み込まれるファイルは異なります。またbashの起動オプションでこれらの無効化したり、別のファイルを読み込ませたりということも可能です。 ファイルに書かれた内容はインタープリタ実行されますのでファイルに記述した内容は上から下の順で実行されます。 以上を踏まえると、`~/.bash_profile` の末尾で ~/.bashrc を読み込み、~/.bashrc の末尾で PATHを設定するのがご要望にかなってる気がします。 ただ、環境変数(exportされる変数)は ~/.bash_profile に書くのが一般的です。理由は 環境変数は子プロセスに引き継がれますので ログイン時に1回だけ設定するのが合理的という考えだと思います。