はじめに (対象読者・この記事でわかること)

本記事は、Linux サーバーの管理者や開発者、特に root 権限で作業する機会が多いエンジニアを対象としています。日常的に /usr/local/bin にインストールしたツールを利用しようとして「コマンドが見つからない」エラーに遭遇した経験がある方は必見です。この記事を読むことで、以下のことが理解できます。

  • root ユーザーのシェル環境で PATH に /usr/local/bin が自動的に含まれないメカニズム
  • その原因となる設定ファイルや sudo の挙動
  • 手元の環境で確実に PATH を追加する手順と、よくある落とし穴の回避方法

Linux の基本的なシェル操作ができる方なら、すぐに実践できる内容です。

前提知識

この記事を読み進める上で、以下の知識があるとスムーズです。

  • Bash もしくは sh 系シェルの基本的な操作(変数展開、環境変数の設定方法)
  • Linux のファイルシステム構造(/etc/profile~/.bashrc など)の概要
  • sudo コマンドの基本的な使い方と、sudoers ファイルの簡単な構文

背景と仕組み:root ユーザーの PATH が期待通りでない理由

Linux では、システム全体に共通する環境変数は /etc/profile/etc/environment に定義され、各ユーザー固有の設定はホームディレクトリ配下の .profile.bashrc.bash_profile などに記述されます。デフォルトのディストリビューション(例: CentOS、Ubuntu)では、/usr/local/sbin/usr/local/bin が PATH に自動的に追加されるように設定されています。

しかし、root ユーザーは ログインシェル非ログインシェル の二つの起動形態があり、起動される設定ファイルが異なるため、思わぬ違いが生じます。

  1. ログインシェル(例: ssh root@hostsu -
    - /etc/profile/root/.bash_profile/root/.profile が順に読み込まれます。
    - ここで /etc/profile.d/*.sh が実行され、/usr/local/sbin:/usr/local/bin が PATH に追加されることが期待されます。

  2. 非ログインシェル(例: susudo -s、Docker の ENTRYPOINT
    - 主に /etc/bash.bashrc(Debian 系)や /etc/bashrc(RHEL 系)が読み込まれ、/root/.bashrc が実行されます。
    - 多くのディストリビューションでは、この段階で /usr/local/bin が PATH に入る設定が 省略 されていることがあります。

さらに、sudo のデフォルト設定では、環境変数 PATHリセット され、secure_path に指定された安全なディレクトリだけが残ります。/etc/sudoersDefaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" が記載されていない場合、sudo 経由で実行したコマンドは /usr/local/bin を参照できません。

以上のように、「root ユーザーで PATH が期待通りに設定されない」 背景は、シェルの起動方式と sudo の環境保護機構に起因しています。

PATH が設定されない原因と対策:具体的な手順と実装方法

ここでは、実際に自分の環境で PATH が欠落しているかどうかを確認し、確実に /usr/local/bin を追加するまでの手順を解説します。

ステップ1:現在の PATH を確認する

まずは、問題の根本を把握するために、root シェルで PATH を確認します。

Bash
# ログインシェルで確認 su - # root に切り替え(ログインシェル) echo $PATH # 非ログインシェルで確認 su # パスワードのみで切り替え(非ログインシェル) echo $PATH # sudo 経由で確認 sudo -i # root の環境を再現 echo $PATH

これら三つのケースで /usr/local/bin が含まれていない 場合、設定ファイルのどこかが原因です。

ステップ2:設定ファイルを調査・修正する

2-1. /etc/profile/etc/profile.d/ の確認

/etc/profile が正しくロードされているか確認します。

Bash
grep -E 'PATH.*usr/local' /etc/profile # 例: PATH="/usr/local/sbin:/usr/local/bin:${PATH}"

もし記述が無い、またはコメントアウトされている場合は、以下の行を追加してください。

Bash
# /etc/profile の末尾に追記 if [ -d /usr/local/bin ]; then PATH="/usr/local/bin:$PATH" fi export PATH

/etc/profile.d/ 配下に local_path.sh のようなファイルを作成しても同様の効果があります。

Bash
# /etc/profile.d/local_path.sh #!/bin/sh if [ -d /usr/local/bin ]; then export PATH="/usr/local/bin:$PATH" fi

作成後は実行権限を付与します。

Bash
chmod +x /etc/profile.d/local_path.sh

2-2. /root/.bash_profile/root/.bashrc の確認

root のホームディレクトリに個別設定がある場合、こちらも修正します。

Bash
cat /root/.bash_profile cat /root/.bashrc

PATH を上書きしている記述があれば、/usr/local/bin を再度 prepend してください。

Bash
# 例: /root/.bashrc の末尾に追記 if [ -d /usr/local/bin ]; then export PATH="/usr/local/bin:$PATH" fi

2-3. sudoerssecure_path 設定を見直す

sudo 経由で実行したときに PATH が欠落する場合は、/etc/sudoers(もしくは /etc/sudoers.d/)に secure_path が正しく設定されているか確認します。

Bash
sudo visudo # 以下の行が存在するか確認 Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

重要ポイント
- 行頭の # が付いているとコメント扱いになるため、必ずアンコメントしてください。
- 変更後は visudo が構文エラーをチェックしてくれるので、安全です。

2-4. 環境変数の保持設定 (env_keep) の活用

一部のケースでは、sudo で特定スクリプトを呼び出す際に PATH を保持したいことがあります。その場合は sudoers に以下を追加します。

Bash
Defaults env_keep += "PATH"

ただし secure_path が優先される点に注意し、secure_path/usr/local/bin が含まれていれば env_keep の記述は不要です。

ハマった点やエラー解決

問題1:/etc/profile.d/ のスクリプトが実行されない

  • 原因/etc/profilesource /etc/profile.d/*.sh を実行していない(ディストリビューション固有の差異)。
  • 解決策/etc/profile の該当箇所に for i in /etc/profile.d/*.sh; do . $i; done を追記、または直接 /etc/bash.bashrc に設定を書き込む。

問題2:sudo -i で PATH がリセットされる

  • 原因sudoerssecure_path がデフォルトの /usr/local/bin を除外している。
  • 解決策visudosecure_path/usr/local/bin を追加。変更後は sudo -k && sudo -i でキャッシュをクリア。

問題3:su(非ログイン)で PATH が異なる

  • 原因/root/.bashrc がログインシェル時にしか読み込まれない設定になっている。
  • 解決策/root/.bash_profileif [ -f ~/.bashrc ]; then . ~/.bashrc; fi を明示的に記載し、非ログインシェルでも同じ設定が適用されるようにする。

解決策のまとめ

  1. 全シェルで共通/etc/profile.d/local_path.sh を作成し、/usr/local/bin を PATH に prepend。
  2. root 個別/root/.bashrc または .bash_profile に同様の export 行を追記。
  3. sudo 環境/etc/sudoerssecure_path/usr/local/bin を含め、必要なら env_keep で PATH を保持。
  4. 再読み込み:設定変更後は source /etc/profilesource ~/.bashrc、あるいはシェルを再起動して反映させる。

以上の手順を踏めば、root ユーザーでも一貫して /usr/local/bin が PATH に含まれるようになります。

まとめ

本記事では、root ユーザーのシェル環境で /usr/local/bin が PATH に自動的に含まれない根本原因と、具体的な設定手順・トラブルシューティング方法を解説しました。

  • 原因はログインシェルと非ログインシェルの設定ファイル差異、そして sudo の secure_path がデフォルトで除外している点にある。
  • 対策/etc/profile.d/ にスクリプトを配置、root の .bashrc に追記、sudoerssecure_path を編集すること。
  • 効果は、どの起動方式でも安定して /usr/local/bin のコマンドが利用でき、運用上の手間が大幅に削減される。

読者の皆さんが、PATH 設定に関する不安や時間ロスから解放され、開発・運用作業に集中できるようになることを願っています。次回は、システム全体の環境変数を一元管理する /etc/environment の活用法について解説する予定です。

参考資料