「PATHを通したはずなのに command not found が出る」
Linuxサーバーの運用で、環境変数のトラブルは避けて通れません。設定方法は分かっていても、永続化の仕組みを正しく理解していないと、同じ問題を何度も繰り返すことになります。
この記事では、bash/sh環境での環境変数の確認・設定・永続化を、
export コマンドと env コマンドを中心に解説します。PATH設定の正しい方法から、.bashrcと.bash_profileの使い分け、cronで変数が効かない問題の対処まで、実務で必要な知識をまとめました。環境変数とは? サーバー管理でなぜ重要なのか
環境変数は、OSやアプリケーションの動作を制御する「名前=値」のペアです。たとえばPATH はコマンドの検索先ディレクトリ、LANG はシステムの言語設定を決めています。サーバー管理の現場では、ミドルウェアのインストール先をPATHに追加したり、アプリケーションの設定値を環境変数で渡したりする場面が頻繁にあります。ここを曖昧にしていると、「自分のターミナルでは動くのに、cronでは動かない」「rootでは動くのに一般ユーザーでは動かない」といったトラブルに悩まされます。
シェル変数と環境変数の違い~exportが分かれ目
bashには「シェル変数」と「環境変数」の2種類の変数があります。この違いを理解することが、exportコマンドを使いこなす第一歩です。・シェル変数:現在のシェルだけで有効。子プロセス(スクリプトやコマンド)には引き継がれない
・環境変数:子プロセスにも引き継がれる。
export で昇格させる# シェル変数の設定(exportなし) $ MYVAR="hello" $ echo $MYVAR hello # 子プロセス(bashを新たに起動)では見えない $ bash -c 'echo $MYVAR' (何も表示されない) # exportで環境変数に昇格させる $ export MYVAR="hello" $ bash -c 'echo $MYVAR' hello
export を付けなければ変数は現在のシェルの中だけで閉じてしまいます。スクリプトや他のコマンドに値を渡す必要がある場合は、必ず export を使ってください。現在の環境変数を確認する方法
1. envコマンドで一覧表示する
env コマンドは、現在設定されている環境変数をすべて表示します。$ env HOSTNAME=web-server01 SHELL=/bin/bash PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin HOME=/home/pakira LANG=ja_JP.UTF-8 (以下省略)
env | grep 変数名 でフィルタリングすると便利です。2. printenvで特定の変数を確認する
printenv は引数なしで一覧表示、引数ありで特定の変数だけを表示できます。# 特定の環境変数を確認 $ printenv PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin # 引数なしで一覧表示(envと同等) $ printenv
3. echo $変数名で値を直接確認する
特定の変数の値だけを素早く確認するなら、echo が最もシンプルです。$ echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin $ echo $LANG ja_JP.UTF-8
環境変数を設定する~export VARIABLE=value
1. 基本の設定方法
export 変数名=値 の形式で環境変数を設定します。=の前後にスペースを入れてはいけません。# 正しい書き方 $ export JAVA_HOME=/usr/lib/jvm/java-17 # NGな書き方(スペースが入っている) $ export JAVA_HOME = /usr/lib/jvm/java-17 bash: export: `=': not a valid identifier
2. 既存の変数を後からexportする
先にシェル変数として設定してから、後でexport することもできます。$ EDITOR=vim $ export EDITOR
PATH変数の設定~コマンドの検索パスを追加する
環境変数の中で最も設定頻度が高いのがPATH です。新しいソフトウェアをインストールした後に「command not found」が出る場合、PATHにそのディレクトリが含まれていないことが原因です。1. 現在のPATHを確認する
$ echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
:)で区切られています。コマンドを実行すると、左から順番に該当する実行ファイルを探していきます。2. PATHにディレクトリを追加する
既存のPATHを消さないように、$PATH を含めて追記するのが鉄則です。# 末尾に追加する(既存コマンドを優先する場合) $ export PATH=$PATH:/opt/myapp/bin # 先頭に追加する(追加したパスを優先する場合) $ export PATH=/opt/myapp/bin:$PATH
export PATH=/opt/myapp/bin のように $PATH を含めずに設定すると、ls や cat など基本コマンドすべてが使えなくなります。慌てずに新しいターミナルを開くか、/usr/bin/bash をフルパスで起動してください。設定を永続化する~再ログイン後も有効にする方法
export で設定した環境変数は、現在のシェルセッションが終了すると消えます。永続化するには、シェルの設定ファイルに記述する必要があります。1. ~/.bash_profileに書く(ログインシェル用)
SSH接続やコンソールログイン時に1回だけ読み込まれるファイルです。環境変数の設定に最も適しています。# ~/.bash_profile に追記 $ vi ~/.bash_profile # 以下の行を追記して保存する export JAVA_HOME=/usr/lib/jvm/java-17 export PATH=$PATH:$JAVA_HOME/bin
2. ~/.bashrcに書く(対話シェル用)
新しいターミナルを開くたびに読み込まれるファイルです。エイリアスやプロンプト設定に使いますが、環境変数を書いても動作します。# ~/.bashrc に追記 export HISTSIZE=10000 export EDITOR=vim
3. /etc/profile.d/ に置く(全ユーザー共通)
システム全体で共通の環境変数を設定するには、/etc/profile.d/ ディレクトリにシェルスクリプトを配置します。# /etc/profile.d/ に設定ファイルを作成する(root権限が必要) # vi /etc/profile.d/myapp.sh export MYAPP_HOME=/opt/myapp export PATH=$PATH:$MYAPP_HOME/bin
.bashrcと.bash_profileの違い~ログインシェルと非ログインシェル
この違いを正しく理解していないと、「設定したのに反映されない」という問題に何度もぶつかります。| ファイル | 読み込まれるタイミング | 主な用途 |
|---|---|---|
| ~/.bash_profile | ログイン時(SSH接続・コンソールログイン)に1回 | 環境変数(PATH等) |
| ~/.bashrc | 対話的な非ログインシェル起動時(新しいターミナルを開く等) | エイリアス・プロンプト設定 |
| /etc/profile | 全ユーザー共通・ログイン時 | システム全体の環境変数 |
| /etc/profile.d/*.sh | /etc/profile から読み込まれる | パッケージ個別の環境設定 |
~/.bash_profile の中に source ~/.bashrc と書かれています。そのため、ログイン時には両方のファイルが読み込まれます。迷ったら ~/.bashrc に書いておけば、ログインシェルでも非ログインシェルでも読み込まれるため安全です。環境変数を削除する~unsetコマンド
不要になった環境変数はunset コマンドで削除できます。変数名の先頭に $ は付けません。# 環境変数を削除する $ unset JAVA_HOME # 確認(何も表示されなければ削除成功) $ echo $JAVA_HOME
実務でよく使う環境変数と設定例
サーバー運用で頻繁に触る環境変数を紹介します。・LANG / LC_ALL:ロケール(言語・文字コード)設定。文字化けの原因調査で必ずチェックする
・PATH:コマンドの検索パス。ミドルウェア導入時に追加が必要
・HISTSIZE:コマンド履歴の保存件数。デフォルトは1000だが、サーバーでは増やしておくと調査時に役立つ
・EDITOR:デフォルトのテキストエディタ。
crontab -e や visudo で使われる・TZ:タイムゾーン設定。ログの時刻に影響するため要確認
# ロケールを日本語UTF-8に設定 $ export LANG=ja_JP.UTF-8 # コマンド履歴を10000件に増やす $ export HISTSIZE=10000 $ export HISTFILESIZE=10000 # デフォルトエディタをvimに設定 $ export EDITOR=vim
「command not found」PATHが通っていない時の対処法
インストール済みのコマンドなのに「command not found」が出る場合、ほぼ確実にPATHの問題です。以下の手順で原因を特定してください。1. コマンドの実体がどこにあるか確認する
# whichで検索(PATHに含まれるディレクトリだけを探す) $ which java /usr/bin/which: no java in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin) # findで直接探す $ find / -name "java" -type f 2>/dev/null /usr/lib/jvm/java-17/bin/java
2. PATHに追加する
$ export PATH=$PATH:/usr/lib/jvm/java-17/bin $ which java /usr/lib/jvm/java-17/bin/java
3. 永続化を忘れない
動作確認が取れたら、~/.bash_profile または /etc/profile.d/ に同じ記述を追加して永続化してください。これを忘れると、次のログイン時にまた「command not found」に逆戻りです。ログアウトすると環境変数が消える時の対処法
export で設定した環境変数がログアウト後に消えるのは、正常な動作です。永続化するには、設定ファイルへの記述が必要です。・個人の設定:
~/.bash_profile または ~/.bashrc に export 変数名=値 を追記する・全ユーザー共通:
/etc/profile.d/変数名.sh にスクリプトとして配置する設定ファイルを編集した後は、
source ~/.bash_profile で即座に反映できます。cronで環境変数が効かない時の対処法
cronはログインシェルを経由しないため、~/.bash_profile や ~/.bashrc は読み込まれません。そのため、PATHやLANGなどの環境変数がcronジョブ内では設定されていない状態になります。対処法1:crontab内で直接定義する
# crontab -e で以下のように記述する PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin LANG=ja_JP.UTF-8 0 3 * * * /opt/myapp/bin/backup.sh
対処法2:スクリプト内でフルパスを使う
# スクリプト内でコマンドをフルパス指定にする #!/bin/bash /usr/bin/find /var/log -name "*.log" -mtime +30 -delete
本記事のまとめ(環境変数の操作早見表)
| やりたいこと | コマンド |
|---|---|
| 環境変数の一覧を表示する | env |
| 特定の環境変数を確認する | printenv PATH |
| 環境変数を設定する | export VARIABLE=value |
| PATHにディレクトリを追加する | export PATH=$PATH:/new/path |
| 環境変数を削除する | unset VARIABLE |
| 設定を永続化する(個人) | vi ~/.bash_profile に export 行を追記 |
| 設定を永続化する(全ユーザー) | vi /etc/profile.d/xxx.sh に export 行を記述 |
| 設定ファイルを即座に反映する | source ~/.bash_profile |
環境変数の設定ミスでサーバートラブルを起こしたくないですか?
exportやPATHの仕組みは、一度正しく理解すれば二度と同じトラブルに悩まされなくなります。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
登録10秒/自動返信でDL/合わなければ解除3秒
