Linuxのenvコマンドは、環境変数を一覧表示する、または環境変数を一時的に指定してコマンドを実行するためのコマンドです。
引数なしで実行すれば現在の環境変数をすべて表示し、VAR=value command の形で指定すれば、そのコマンドの実行中だけ変数を変更できます。設定は一時的なので、元のシェル環境には影響しません。
実務では「一時的な設定でのテスト」「クリーンな環境での起動」「shebangで実行ファイルをPATHから探す」などに使います。
環境変数を一覧表示する
envを引数なしで実行すると、現在の環境変数をすべて NAME=VALUE 形式で出力します。
# 環境変数をすべて表示
env
# アルファベット順に並べて表示
env | sort
# PATH だけを絞り込む
env | grep PATH
# HOME と USER を確認
env | grep -E '^(HOME|USER)='
env | sort は変数が多いときに見やすく、env | grep は特定の変数だけを確認するときに便利です。
一時的に環境変数を指定してコマンドを実行する
env VAR=value command の形で、コマンドの実行中だけ環境変数を変更できます。コマンドが終了すると元の環境に戻ります。
# NODE_ENV を一時的に production にしてサーバーを起動
env NODE_ENV=production node server.js
# LANG を一時的に C にしてソートを実行(ロケールの影響を排除)
env LANG=C sort file.txt
# DEBUG フラグを立ててスクリプトを実行
env DEBUG=true ./myscript.sh
export NODE_ENV=production と違い、そのコマンドの実行時だけ有効で、現在のシェルには設定が残りません。
複数の環境変数を同時に指定する
NAME=VALUE を空白区切りで並べると、複数の環境変数を同時に設定できます。
# NODE_ENV と PORT を同時に指定
env NODE_ENV=production PORT=8080 node server.js
# LANG と TZ を同時に変更してコマンドを実行
env LANG=C TZ=UTC date
# PATH と LANG を指定して実行
env PATH=/usr/local/bin:/usr/bin:/bin LANG=C.UTF-8 bash -c 'echo $PATH'
クリーンな環境(空の環境)でコマンドを実行する
env -i を使うと、現在の環境変数をすべてリセットした「空の環境」でコマンドを起動できます。他の変数の影響を排除したいテスト時などに使います。
# 完全にクリーンな環境で実行(PATH も消えるのでフルパスが必要)
env -i /usr/bin/printenv
# 最低限の PATH と LANG を指定して実行
env -i PATH=/usr/bin:/bin LANG=C.UTF-8 bash -c 'printenv | sort'
# クリーン環境で Python スクリプトを動かす
env -i HOME=/tmp PATH=/usr/bin:/bin python3 script.py
注意: env -i を使うと PATH も消えるため、コマンドがフルパスでないと実行できません(後述の「よくある失敗例」参照)。
特定の環境変数を削除して実行する
env -u VAR を使うと、指定した変数だけを削除してコマンドを実行できます。
# プロキシ設定を外して curl を実行
env -u http_proxy curl https://example.com
# HTTP と HTTPS の両方のプロキシを外す
env -u http_proxy -u https_proxy curl https://example.com
# DEBUG 変数を外してスクリプトを実行
env -u DEBUG ./myscript.sh
PATHやLANGを一時的に変更する実用例
PATHやLANGを一時的に変更したいケースは実務でよくあります。
PATHを一時的に変更する
# /opt/myapp/bin を優先する PATH でコマンドを実行
env PATH=/opt/myapp/bin:$PATH mycommand
# 特定のディレクトリだけの PATH でビルドスクリプトを実行
env PATH=/usr/local/bin:/usr/bin:/bin make build
# COMMAND の探索だけ別 PATH を使う(環境の PATH は変更しない)
env -P /opt/bin:/usr/bin mytool
LANGを一時的に変更する
# ロケールを C にしてソートをバイト順で実行
env LANG=C sort names.txt
# 日本語ロケールでコマンドを実行
env LANG=ja_JP.UTF-8 date
# メッセージを英語で出力させる
env LANG=C ls --color=never nonexistent_file
構文(Syntax)
# 基本形(GNU coreutils)
env [OPTION]... [-] [NAME=VALUE]... [COMMAND [ARG]...]
# 代表例
env VAR=value command arg1 arg2
env -i PATH=/usr/bin:/bin LANG=C command
env -u NAME command
env -C /workdir -S 'python3 -O' script.py
NAME=VALUEを並べると、その設定を反映した環境でCOMMANDが起動されます。- 引数が何もなければ、現在の環境を
NAME=VALUE形式で一覧表示します。
主なオプション一覧
| オプション | 説明 | 使用例 |
|---|---|---|
-i, --ignore-environment | 空の環境から開始(最低限の PATH 等を自分で設定) | env -i PATH=/usr/bin:/bin bash -c 'command -v ls' |
-u NAME, --unset=NAME | 変数 NAME を削除して実行 | env -u http_proxy curl https://example.com |
-C DIR, --chdir=DIR | 実行前に 作業ディレクトリを変更 | env -C /srv/app npm start |
-S STRING, --split-string=STRING | 文字列を空白区切りで分割して引数化(shebang向け) | env -S 'python3 -O' -- version |
-P PATH, --path=PATH | COMMAND の探索に使う PATH を一時指定(環境の PATH は変更しない) | env -P /opt/bin:/usr/bin mytool |
-0, --null | 環境一覧の各行末を NUL 文字で出力(パイプで安全) | env -0 | xargs -0 ... |
-v, --debug | 起動時の探索や設定を詳細表示 | env -v -P /usr/local/bin prog |
-(単体のハイフン) | -i と同義(空の環境から) | env - PATH=/usr/bin printenv PATH |
--help, --version | ヘルプ/バージョン表示 | env --help |
実装によって対応オプションが異なります(GNU、BSD、BusyBox など)。上表は主に GNU 版を前提にしています。
シェルスクリプトでの使い方
shebangで環境非依存のスクリプトを書く
スクリプトの先頭行(shebang)で /usr/bin/env を使うと、PATH からインタープリタを探してくれるため、インタープリタのパスに依存しない書き方になります。
#!/usr/bin/env python3
#!/usr/bin/env node
#!/usr/bin/env bash
shebangで複数引数を渡す(-S の利用)
OSによってはshebangに渡せる引数が1つに制限されるため、-S で文字列を分割します(GNU拡張)。
#!/usr/bin/env -S python3 -O
スクリプト内で一時的な環境を使う
#!/usr/bin/env bash
# テスト時は TEST_MODE=1 でコマンドを呼ぶ
env TEST_MODE=1 ./run-tests.sh
# 本番では環境変数なしで実行
./run-app.sh
printenvとの違い
printenv は「環境変数の表示専用」のコマンドです。env との主な違いは次の通りです。
| コマンド | 主な用途 | 特徴 |
|---|---|---|
env | 環境変数の一覧表示 + 環境を変更してコマンドを実行 | 環境変数の設定・削除・クリーン環境での実行も可能 |
printenv | 環境変数の一覧表示 + 特定変数の値を表示 | 表示に特化。printenv PATH で1変数だけ取得できる |
# printenv で特定の変数だけ表示(env にはない機能)
printenv PATH
printenv HOME
# env で全変数を表示(printenv と同等)
env
# NUL 区切りで出力(どちらも可能)
env -0
printenv -0
単に「特定の環境変数の値を確認したい」だけなら printenv VAR の方がシンプルです。コマンドを起動したり環境を操作したりする場合は env を使います。
exportとの違い
export はシェルの組み込みコマンドで、「現在のシェルに環境変数を設定する」ものです。一方 env は「コマンドを実行するときだけ環境変数を変更する」ものです。
export VAR=value | env VAR=value command | |
|---|---|---|
| 設定の持続 | シェルセッション中ずっと有効 | コマンド実行中だけ有効 |
| 現在のシェルへの影響 | あり | なし |
| 用途 | シェル全体で変数を使いたいとき | 1回だけ変数を変えてコマンドを実行したいとき |
# export: 現在のシェルに設定が残る
export NODE_ENV=production
node server.js # NODE_ENV=production で実行
node client.js # こちらも NODE_ENV=production のまま
# env: そのコマンドの実行時だけ
env NODE_ENV=production node server.js # NODE_ENV=production
node client.js # NODE_ENV は変わっていない
env はスクリプト内で「この1回だけ環境を変えて実行したい」という用途に適しています。
.envファイルとの違い
.env ファイルは Node.js(dotenv)や Docker Compose などで使われる「環境変数をファイルで管理する」仕組みです。env コマンドとは別のものです。
env コマンド | .env ファイル | |
|---|---|---|
| 何か | Linux/Unixの標準コマンド | 環境変数をまとめたテキストファイル |
| 読み込み方 | シェルから直接実行 | dotenv ライブラリや export $(cat .env) などで読み込む |
| 用途 | コマンド実行時の環境変数の一時変更 | アプリの設定値を環境ごとに管理 |
env コマンド自体は .env ファイルを自動で読み込む機能を持っていません。.env ファイルの内容をシェルに読み込むには、set -a; source .env; set +a などの方法を使います。
よくある失敗例
env で設定した値が次のコマンドでも使えると思い込む
# NG: env で設定した値は次のコマンドには引き継がれない
env NODE_ENV=production node server.js
echo $NODE_ENV # 空(設定されていない)
# OK: 永続させたい場合は export を使う
export NODE_ENV=production
node server.js
echo $NODE_ENV # production
export との違いを混同する
env VAR=value は「コマンド実行中だけ」有効です。シェルに設定を残したい場合は export を使う必要があります。
.env ファイルと env コマンドを混同する
env コマンドは .env ファイルを自動で読み込みません。.env ファイルを使いたい場合は dotenv ライブラリや専用ツールが必要です。
env -i で PATH がなくなりコマンドが見つからない
# NG: env -i で PATH も消えるため ls が見つからない
env -i ls
# env: 'ls': No such file or directory
# OK: PATH を明示して渡す
env -i PATH=/usr/bin:/bin ls
# または絶対パスで指定する
env -i /bin/ls
よくある疑問
env は何をするコマンドか
引数なしで実行すると現在の環境変数をすべて表示します。VAR=value command の形で使うと、その変数を一時的に設定してコマンドを実行します。現在のシェルには影響しません。
環境変数を一覧表示するにはどうするか
# すべての環境変数を表示
env
# アルファベット順に並べる
env | sort
# 特定のキーワードで絞り込む
env | grep PATH
一時的に環境変数を指定するにはどうするか
# env VAR=value command の形で使う
env LANG=C sort file.txt
env NODE_ENV=production node server.js
env と export は何が違うか
export は現在のシェルセッション中ずっと環境変数を設定します。env は指定したコマンドの実行中だけ変数を変更し、コマンドが終わると元に戻ります。
env と printenv は何が違うか
printenv は環境変数の表示に特化したコマンドで、printenv PATH のように特定の変数を1つだけ表示できます。env は表示だけでなく、コマンド実行時の環境変数の変更もできます。
関連コマンド
printenv: 環境変数の表示専用(NUL 区切り-0など)。特定変数の値を取得するのに便利。- シェル組み込み
export/set: 環境(とシェル変数)の定義・参照。現在のシェルセッション全体に設定が反映される。 envsubst: 文字列/テンプレート内の環境変数置換(gettext)。direnv: ディレクトリ単位で環境を自動切替える補助ツール。sudo -E/sudo env "VAR=...": 権限昇格時の環境引き継ぎ/設定。
備考
- アプリ探索と
-P:-PはCOMMANDの探索時だけ指定の PATH を使用し、環境のPATH自体は書き換えません。 -S(split-string): shebang で複数引数を扱うための GNU 拡張。古いenvや一部 OS には無い場合があります。- プラットフォーム差: BSD/BusyBox 版は
-C/-P/-S/-0/-vなどが無い/挙動が異なることがあります。移植性が必要ならenv --helpで確認。 - セキュリティ: 外部入力を環境に渡す際は PATH やロケール(
LC_*,LANG)、ローダ関連(LD_*)などに注意してください。env -iで最小限から積み上げるのが安全です。 - 一覧表示: 単に環境を表示したいだけなら
printenvの方がオプションが明快です。
参考
- GNU coreutils: env — run a program in a modified environment
https://www.gnu.org/software/coreutils/manual/html_node/env-invocation.html - POSIX
env仕様
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/env.html - Linux man-pages
env(1)(GNU 系)
https://man7.org/linux/man-pages/man1/env.1.html - FreeBSD
env(1)(BSD 実装の書式)
https://man.freebsd.org/cgi/man.cgi?env(1) - BusyBox
env(機能差の確認)
https://busybox.net/downloads/BusyBox.html - Shebang と
env -Sの背景説明(coreutils)
https://www.gnu.org/software/coreutils/manual/html_node/Invoking-env.html#Splitting-with-_002dS

コメント