誰でもセミコロンがLANG
bashによって更新されたと見なされるために必要な理由を説明できますか?
動作しません:
> LANG=Ja_JP bash -c "echo $LANG"
en_US
作品:
> LANG=Ja_JP ; bash -c "echo $LANG"
Ja_JP
Linux上のbash 4.1.10とcygwinの同じバージョンの両方で作業しています
誰でもセミコロンがLANG
bashによって更新されたと見なされるために必要な理由を説明できますか?
動作しません:
> LANG=Ja_JP bash -c "echo $LANG"
en_US
作品:
> LANG=Ja_JP ; bash -c "echo $LANG"
Ja_JP
Linux上のbash 4.1.10とcygwinの同じバージョンの両方で作業しています
回答:
コマンドが読み取られるとき、実行される前に、パラメーターおよびその他のタイプの展開が実行されます。
最初のバージョンLANG=Ja_JP bash -c "echo $LANG"
は、単一のコマンドです。そのように解析された後、何かが実行される前に$LANG
展開en_US
されます。一度bash
入力の処理を終了している、それは、プロセスをフォーク追加LANG=Ja_JP
期待として環境中に、次に実行されますbash -c echo en_US
。
単一引用符、つまりLANG=Ja_JP bash -c 'echo $LANG'
outputsで展開を防ぐことができますJa_JP
。
コマンドの一部として変数の割り当てがある場合、割り当てはそのコマンドの環境にのみ影響し、シェルの環境には影響しないことに注意してください。
2番目のバージョンは、LANG=Ja_JP; bash -c "echo $LANG"
実際には順番に実行される2つの個別のコマンドです。1つはコマンドなしの単純な変数割り当てであるため、現在のシェルに影響します。
したがって、単一のの表面的な違いにもかかわらず、2つのスニペットは根本的に異なります;
。
完全にトピック外ですが、.UTF-8
when設定を追加することをお勧めしますLANG
。21世紀にUnicodeを使用しない理由は今のところありません。
VAR=value; somecommand
に等しい
VAR=value
somecommand
これらは、次々に実行される無関係なコマンドです。最初のコマンドは、シェル変数に値を割り当てますVAR
。VAR
既に環境変数でない限り、環境にエクスポートされず、シェルの内部に残ります。ステートメントexport VAR
はVAR
環境にエクスポートします。
VAR=value somecommand
別の構文です。割り当てVAR=value
は環境に対するものですが、この割り当てはの実行環境でのみ行われsomecommand
、その後のシェルの実行では行われません。
例として:
# Assume neither VAR1 nor VAR2 is in the environment
VAR1=value
echo $VAR1 # displays "value"
env | grep '^VAR1=' # displays nothing
VAR2=value env | grep '^VAR2=' # displays "VAR2=value"
echo $VAR2 # displays nothing