env は環境変数を一時的に変更してコマンドを実行したり、引数がなければ現在の環境変数を一覧表示するコマンドです。
実務では「クリーンな環境での起動」「一時的な設定でのテスト」「shebang で実行ファイルを PATH から探す」などに使います。
構文(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 |
-v, --debug | 起動時の探索や設定を詳細表示 | env -v -P /usr/local/bin prog |
-, (単体のハイフン) | -i と同義(空の環境から) | env - PATH=/usr/bin printenv PATH |
--help, --version | ヘルプ/バージョン表示 | env --help |
実装によって対応オプションが異なります(GNU、BSD、BusyBox など)。上表は主に GNU 版を前提にしています。
実行例
一時的に環境変数を設定して実行
説明: NODE_ENV=production でアプリを起動します。
コマンド:
env NODE_ENV=production PORT=8080 node server.js
完全にクリーンな環境から起動(最低限の PATH を付与)
説明: 他の変数の影響を避けたい検証時に。
コマンド:
env -i PATH=/usr/bin:/bin LANG=C.UTF-8 bash -lc 'printenv | sort | head'
特定の変数だけ外して実行
説明: プロキシ設定を外して curl を実行します。
コマンド:
env -u http_proxy -u https_proxy curl https://example.com
shebang で複数引数を渡す(-S の利用)
説明: OS が shebang の1引数制限を持つため、-S で分割します。
コマンド(スクリプト先頭行):
#!/usr/bin/env -S python3 -O
この例では python3 に -O を併せて渡せます。
実行時にディレクトリを切り替える
説明: /var/www に移動してからビルド。
コマンド:
env -C /var/www make build
エラー例:-i で PATH を消してコマンド未検出
説明: 何も設定しないとコマンドが見つかりません。
コマンド:
env -i ls
出力例(例):
env: ‘ls’: No such file or directory
対処: PATH を明示してから実行します(例: env -i PATH=/usr/bin:/bin ls)。
関連コマンド
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

コメント