Linuxのenvコマンドとは?環境変数の確認・一時指定・exportとの違いを解説

コマンドリファレンス

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=PATHCOMMAND の探索に使う 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=valueenv 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: -PCOMMAND の探索時だけ指定の 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 の方がオプションが明快です。

参考

Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする

コメント