「シェルスクリプトの1行目にある #!/usr/bin/env bash って何だろう?」
環境変数はLinuxのあらゆる場面で使われています。コマンドの検索パス、言語設定、ホームディレクトリなど、システムの動作を裏で制御する重要な仕組みです。
この記事では、
env コマンドの実践的な使い方を解説します。環境変数の一覧表示から、一時的な変数設定でのコマンド実行、
export や printenv との違い、#!/usr/bin/env の仕組みまで網羅しました。・envコマンドで環境変数一覧の表示と、一時的な変数設定でのコマンド実行ができる
・env / printenv / export / setの違いを正確に把握して使い分ける
・#!/usr/bin/env bashの仕組みを理解すると、移植性の高いスクリプトが書ける
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
envコマンドとは?環境変数の基本
env は、環境変数の一覧表示と、環境変数を一時的に変更してコマンドを実行するためのコマンドです。環境変数とは、シェルやプログラムに渡される「名前=値」形式の設定情報です。代表的なものを確認しておきましょう。
・PATH:コマンドの検索パス(コロン区切り)
・HOME:ユーザーのホームディレクトリ
・LANG:言語・ロケール設定
・SHELL:ログインシェルのパス
・USER:現在のユーザー名
・TERM:端末の種類
環境変数は子プロセスに引き継がれるのが特徴です。一方、
export していないシェル変数は、そのシェル内でしか参照できません。envコマンドの基本的な使い方
1. 環境変数の一覧を表示する
引数なしでenv を実行すると、現在設定されている環境変数が全て表示されます。$ env HOSTNAME=web-server01 SHELL=/bin/bash USER=tomohiro PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin HOME=/home/tomohiro LANG=ja_JP.UTF-8 (以下省略)
grep と組み合わせて絞り込みましょう。# PATH関連の環境変数だけ表示する $ env | grep PATH PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
2. 特定の環境変数の値を確認する
特定の変数だけ確認したい場合は、echo や printenv の方が便利です。# echoで確認する $ echo $HOME /home/tomohiro # printenvで確認する $ printenv HOME /home/tomohiro
3. 環境変数を一時的に設定してコマンドを実行する
env の最も実用的な機能がこれです。環境変数を一時的に変更した状態でコマンドを実行できます。元の環境変数は変更されません。# LANGを一時的にCに変更してdateコマンドを実行する $ env LANG=C date Sat Mar 22 10:00:00 JST 2026 # 通常のdateコマンド(日本語ロケール) $ date 2026年 3月22日 土曜日 10:00:00 JST
envの応用オプション
1. env -i でクリーンな環境でコマンドを実行する
-i(ignore-environment)オプションを付けると、全ての環境変数をクリアした状態でコマンドを実行できます。# クリーンな環境でbashを起動する $ env -i bash # 環境変数がほぼ空の状態になる $ env PWD=/home/tomohiro SHLVL=1 _=/usr/bin/env
2. env -u で特定の環境変数を除外する
-u(unset)オプションで、特定の変数を除外してコマンドを実行できます。# http_proxyを除外してcurlを実行する $ env -u http_proxy curl https://example.com
env・export・printenv・setの違い
環境変数を扱うコマンドは複数あります。違いを整理しておきましょう。| コマンド | 用途 | 表示対象 |
|---|---|---|
| env | 環境変数の一覧表示 / 一時設定で実行 | 環境変数のみ |
| printenv | 環境変数の表示(個別指定可) | 環境変数のみ |
| export | シェル変数を環境変数に昇格させる | exportされた変数 |
| set | シェル変数と環境変数の両方を表示 | 全変数(関数含む) |
env と printenv は環境変数だけを表示しますが、set はシェル変数(exportしていない変数)や関数定義も含めて表示します。# シェル変数は env では表示されない $ MY_VAR="hello" $ env | grep MY_VAR (何も表示されない) # exportすると環境変数になり、envで表示される $ export MY_VAR="hello" $ env | grep MY_VAR MY_VAR=hello
#!/usr/bin/env の仕組みと使い方
シェルスクリプトやPythonスクリプトの1行目でよく見かける#!/usr/bin/env bash について解説します。#!/usr/bin/env bash echo "Hello, World!"
#!/bin/bash と直接パスを書くよりも移植性が高くなります。たとえば、Pythonスクリプトでは以下のように書くのが一般的です。
#!/usr/bin/env python3 import sys print(sys.version)
/usr/bin/python3 と書くとそのパスにPythonがない環境ではエラーになりますが、/usr/bin/env python3 ならPATH上のどこにあっても正しく実行されます。環境変数が反映されない場合のトラブルシュート
1. exportを忘れている
変数を定義しただけでは、子プロセスに引き継がれません。# これだとシェル変数のまま(子プロセスに渡らない) $ MY_VAR="test" # exportで環境変数にする $ export MY_VAR="test"
2. .bashrcの変更が反映されていない
~/.bashrc に環境変数を追記した場合、新しいシェルを開くか source コマンドで再読み込みしてください。# .bashrcを再読み込みする $ source ~/.bashrc
3. ログインシェルと非ログインシェルの違い
SSH接続(ログインシェル)では~/.bash_profile が読まれますが、ターミナルエミュレータ(非ログインシェル)では ~/.bashrc だけが読まれます。環境変数の設定場所が間違っていると、特定の場面でだけ変数が未定義になります。確実に反映させたい場合は、
~/.bash_profile から ~/.bashrc を読み込む設定にしておくのが定番です。# ~/.bash_profile に以下を記述しておく if [ -f ~/.bashrc ]; then source ~/.bashrc fi
本記事のまとめ
| やりたいこと | コマンド |
|---|---|
| 環境変数を一覧表示する | env |
| 特定の環境変数を確認する | printenv 変数名 |
| 一時的に環境変数を変更して実行する | env LANG=C コマンド |
| クリーンな環境でコマンドを実行する | env -i コマンド |
| 特定の環境変数を除外して実行する | env -u 変数名 コマンド |
| シェル変数を環境変数にする | export 変数名=値 |
環境変数の仕組みを正しく理解して、スクリプトのトラブルを自力で解決できるようになりたいですか?
環境変数の設計ミスはサーバー障害の原因になります。現場レベルの知識を体系的に学んでおきましょう。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
- 次のページへ:sourceコマンドで設定ファイルを即時反映する方法|bashrcの読み込みとドットコマンド
- 前のページへ:setenvコマンドで環境変数を設定する方法|csh・tcshの書き方とbash exportとの違い
- この記事の属するカテゴリ:Linuxコマンド・LinuxコマンドA-E・システム管理コマンドへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。
登録無料・いつでも解除できます