Linuxのログイン時の環境変数の読込順

順番

  1. /etc/profile
  2. /etc/profile/profile.d配下
  3. ~/.bash_profile 
  4. ~/.bash_login
  5. ~/.profile
  6. ~/.bashrc
  7. /etc/bashrc

補記事項

  • /etc/profile/profile.dはディレクトリで、その配下にあるスクリプト内で定義
    • RHEL/CentOSは何も置いてないイメージ
    • ubuntuは結構もっさりあるイメージ
  • .bash_profile, .bash_login, .profileはもしかしたらどれか読み込んだら、他を読み飛ばすかも(きちんと実験していないので分からない)

その他配慮ポイント

  • サービスやcronで実行される場合は、上記ファイル群の定義を参照しない
  • /etc/environmentで定義されている場合、それが読み込まれる(※1)
  • crontabのPATH変数は/etc/crontab内に定義されている場合がある(※2)
  • /etc/sudoersのsecure_pathはsudo実行時のみ上書きされる(cron実行時には評価されない)
  • suコマンドに-オプション付けてログインしている時としていない場合でも変わる
  • systemdのユニットファイルに環境変数が定義されている場合がある
  • /etc/locate.conf で定義されている場合もある
  • それ以外にもスクリプトのどこかで上書きされている場合がある
  • 上書きされている場合もあれば、追記という形で定義されている場合がある
  • 手動実行時とサービス等での実行時では変わる要素がありすぎるため、必ずテストすること
  • 必ず、必ずテストすること(2度目)
  • かくいう私も7年程前にやらかしてる…
  • 上記に理解誤り、配慮漏れはあるかもしれない

※1 参照される主なシーン

  • システムサービス
  • 実行中のデーモン

※2 /etc/crontabに定義されている例(※3)

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
(以下略)

※3 CentOSでは定義されていること多いが、ubuntuでは定義されていない様な気がする