2016-10-14 8 views
12

設定するだけで環境変数を印刷するにはどうすればよいですか?環境変数を表示/エコーする方法は?

NAME=sam echo "$NAME" # empty 

ここではevalを使用しています。これは方法ですか?

NAME=sam eval 'echo $NAME' # => sam 
+2

'NAME = sam echo whatever'は、シェルの' NAME'の値を変更しません。 – rici

答えて

16

これらは、異なるコマンドなどを移動する必要があります:

NAME=sam; echo "$NAME" 
NAME=sam && echo "$NAME" 

NAME変数が渡された時点でので、空の文字列に展開$NAMEは、echoを実行する前に、以前のシェルによって行われますechoコマンドの環境では、展開はすでに完了しています(ヌル文字列に)。

1つのコマンドで同じ結果を得るために:

NAME=sam printenv NAME 
+0

'printenv'に関する注釈を追加しました。 @heemayl –

+0

@AaronMcDaid冗長な 'env'を削除していただきありがとうございます。 – heemayl

+1

'printenv'ベースのコマンドだけがOPのコマンドの意味を保持していることに注意してください。' NAME'を_コマンドスコープの環境変数として定義すると、呼び出されたコマンドとその子プロセスだけが見ることができます。他のコマンドは、非常に異なる何かを行います。つまり、 'NAME'をシェルのexit_until-current-shell-exitとして定義します。それ以降のすべての_shell_コマンドは参照しますが、_no external utilities_は表示しません。 – mklement0

2

これは、セミコロンで、あまりにも動作します。

NAME=sam; echo $NAME

2

構文

variable=value command 

は、多くの場合、特定のプロセスの環境変数を設定するために使用されます。しかし、どのプロセスがどの変数を取得し、どのプロセスがそれを解釈するのかを理解する必要があります。例として、2つのシェルを使用する場合:

a=5 
# variable expansion by the current shell: 
a=3 bash -c "echo $a" 
# variable expansion by the second shell: 
a=3 bash -c 'echo $a' 

結果は最初のエコーでは5、2番目のエコーでは5になります。一緒に重要な明確化と、既存の答えを持って

2

:述べたように

NAME=sam echo "$NAME"の問題は割り当てNAME=samが有効になる前$NAMEが現在のシェルによって展開されることをです。 ((無効)溶液試行NAME=sam echo "$NAME"の)元のセマンティクスを維持

ソリューション:

evalのいずれかを使用して、[1](質問自体のように) 、またはprintenv(によって追加されるようアーロンheemayl's answerにMcDaid)、又はbash -cLjm Dullaart's answerから)、効率の降順で:

NAME=sam eval 'echo "$NAME"' # use `eval` only if you fully control the command string 
NAME=sam printenv NAME 
NAME=sam bash -c 'echo "$NAME"' 

printenvはPOSIXユーティリティではありませんが、LinuxとmacOS/BSDの両方で使用できます。

  • のみを呼び出されたコマンドのために定義されて環境変数
  • として:

    何の呼び出し(<var>=<name> cmd ...)のこのスタイルが行うことNAMEを定義することです。 ;既存のNAME変数遺骨NAMEだけ呼び出されて、コマンドのために存在し、NAMEという名前の変数が後に何も存在しません、以前に存在しなかった場合は現在のシェル(には影響しません。つまり

変更なし)。

POSIXはこの種の呼び出しの規則をCommand Search and Execution章で定義しています。


次のソリューションは非常に異なっheemayl's answerから)動作:

NAME=sam; echo "$NAME" 
NAME=sam && echo "$NAME" 

それらは同じ出力を生成するが、それらは代わり定義:

  • シェル変数NAMEecho環境変数NAMEに頼っていたコマンドであれば、それは(以前と異なったり、潜在的に定義)に定義されない変数
    • (だけ)ではなく環境。
  • は、コマンドの後にに存在します。シェル変数は、現在のシェルとそのサブシェルにのみ表示されますが、ない子プロセスに、のような:すべての環境変数は、シェル変数として公開されていますが、逆は真ではありません

注意外部のユーティリティと(非ソースの)スクリプト(exportまたはdeclare -xで環境変数としてマークされていない場合)。


zshであるように)[1]技術的に、bashここでPOSIXに違反している:eval組み込み特殊シェルであるので、先行NAME=sam割り当ては可変$NAMEが残存させるべきですコマンドが終了した後でスコープ内にあるが、それは何が起こるかではない。
ただし、bashをPOSIX互換モードで実行すると、になります。
dashおよびkshは常に準拠しています。
厳密なルールは複雑で、いくつかの側面は実装に任せて決定します。再びCommand Search and Executionを参照してください。

関連する問題