環境変数とコマンドの間にセミコロンを使用する場合


14

誰でもセミコロンがLANGbashによって更新されたと見なされるために必要な理由を説明できますか?

動作しません:

> LANG=Ja_JP bash -c "echo $LANG"
en_US

作品:

> LANG=Ja_JP ; bash -c "echo $LANG"
Ja_JP

Linux上のbash 4.1.10とcygwinの同じバージョンの両方で作業しています

回答:


23

コマンドが読み取られるとき、実行されるに、パラメーターおよびその他のタイプの展開が実行されます。

最初のバージョン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-8when設定を追加することをお勧めしますLANG。21世紀にUnicodeを使用しない理由は今のところありません。


素晴らしい答え-ありがとう!UTF-8の追加に関して。私は、いくつかの非常に古いプラットフォームで動作する必要があるアプリケーションのロケール処理をテストしようとしています。このような違い(ありがたいことにあなたが説明した)と、Linuxとcygwinの違いとの間で、私はバスに没頭しようとしています!
リチャードコーデン

5

VAR=value; somecommand に等しい

VAR=value
somecommand

これらは、次々に実行される無関係なコマンドです。最初のコマンドは、シェル変数に値を割り当てますVARVAR既に環境変数でない限り、環境にエクスポートされず、シェルの内部に残ります。ステートメントexport VARVAR環境にエクスポートします。

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

シェル変数と環境変数の違いについては本当に考えていませんでした。調査に行かなければなりません。答えてくれてありがとう。
リチャードコーデン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.