envコマンドは、別のコマンドを引数に取ります。その別のコマンドに対して、envコマンドで一時的に修正した環境変数を用いてコマンドを実行します。
envコマンドでコマンドを引数に取らない場合は環境変数を表示することができます。また、envコマンドは、組み込みコマンドを実行しない特徴もあります。
目次
環境変数とは
環境変数は、プログラムが実行するときに、その実行するプログラムに渡される文字列のリストのことです。環境変数はname-valueのペアで、name=valueの形式で表されます。
bashの場合、exportやdeclare -xのコマンドで環境変数を設定することができます。
また、コマンドの前に変数を代入するような構文を入れるとそのコマンドだけに対して、環境変数を設定することもできます。例えば、manコマンドのマニュアルを英語で確認する場合は以下のコマンドが利用できます。
1 |
LANG=C man man |
環境変数とは別にシェル変数というものもあります。シェル変数は環境変数のように実行するプログラムに変数を渡しません。また、以下のようにコマンドなしで変数に代入するとシェル変数を設定することができます。
1 |
var='hello' |
bashでシェル変数を確認するには組み込みコマンドのsetコマンドやdeclare -pですべてのシェル変数を確認することができます。
コマンド例
1 |
set |
または
1 |
declare -p |
envコマンドの構文
envコマンドの基本的な構文
1 |
env [name=value]... [command [args]...] |
環境変数の表示
1 |
env |
envコマンドの利用例
環境変数の表示
(実行するコマンドを省略)
envコマンドは、実行するコマンドを省略して実行すると現在の環境変数をすべて表示します。これはprintenvコマンドと同じになります。
コマンド例
1 |
env |
実行結果
1 2 3 4 5 6 |
LS_COLORS= PWD=/home/ubuntu SHLVL=1 LESSOPEN=| /usr/bin/lesspipe %s LESSCLOSE=/usr/bin/lesspipe %s %s _=/usr/local/bin/env |
環境変数を一時的に変更してコマンドを実行
日本語環境でdateコマンドで現在時刻を表示するときに日本語で現在時刻が表示されます。この時、一時的に環境変数を変更し、LANG=Cとして英語環境で現在時刻を表示したいときにenvコマンドを利用できます。
コマンド例と実行結果
1 2 3 4 |
$date 2017年 11月 21日 火曜日 16:05:04 JST $env LANG=C date Tue Nov 21 16:05:09 JST 2017 |
コマンド例と実行結果
1 2 |
$LANG=C date Tue Nov 21 16:25:15 JST 2017 |
また、envコマンド内で変更した環境変数を、envコマンド内で実行するコマンドで使用する場合は工夫が必要になります。例えば、以下のコマンドはうまく働きません。
1 |
$env VAR=world echo hello $VAR |
例えば、set -xのコマンドでシェルがこのコマンドをどのように解釈しているかを確認することができます。
1 2 3 4 |
$set -x $env VAR=world echo hello $VAR + env VAR=world echo hello hello |
環境変数VARはenvコマンドが実行される前にシェルによって展開されてしまいます。
このシェルの展開を防ぐ方法は、中間コマンドとしてbashを用いて、コマンドを実行することです。
コマンド例と実行結果
1 2 |
$env VAR=world bash -c 'echo hello $VAR' hello world |
環境変数を一時的にすべて削除
(-オプションまたは-iオプション)
-または-iオプションで、環境変数を一時的にすべて削除してから、envコマンドで設定される環境変数を代入します。コマンド例では、コマンドを引数に取らないため、envコマンドは環境変数を表示します。
コマンド例
1 |
env - USER="$USER" VAR="test" |
または
1 |
env -i USER="$USER" VAR="test" |
実行結果
1 2 |
USER=ubuntu VAR=test |
特定の環境変数を一時的に削除
(-uオプション)
-uオプションは、指定した環境変数を一時的に削除することができます。コマンド例では、grepコマンドで指定した環境変数が消えているかを確認しています。また、コマンド例では、コマンドを引数に取らないため、envコマンドは環境変数を表示します。
コマンド例と実行結果
1 2 3 4 |
$env | grep 'USER' USER=ubuntu $env -u USER | grep 'USER' $ |
コマンドを実行する前に作業ディレクトリを変更
(-Cオプション)
-Cオプションは、シェルの作業ディレクトリを変更せずに、実行するコマンドでの作業ディレクトリを変更してコマンドを実行することができます。
コマンド例と実行結果
1 2 3 4 |
$pwd /home/ubuntu $env -C /bin pwd /bin |
組み込みコマンドは実行しない
envコマンドは組み込みコマンドを実行しません。例えば、bashの組み込みコマンドの例としてdeclareコマンドやexitコマンド等があります。これをenvコマンドで実行しようとすると実行に失敗するので注意が必要です。
コマンド例と実行結果
1 2 3 4 |
$env declare env: `declare': No such file or directory $env exit env: `exit': No such file or directory |