設定するだけで環境変数を印刷するにはどうすればよいですか?環境変数を表示/エコーする方法は?
NAME=sam echo "$NAME" # empty
ここではeval
を使用しています。これは方法ですか?
NAME=sam eval 'echo $NAME' # => sam
設定するだけで環境変数を印刷するにはどうすればよいですか?環境変数を表示/エコーする方法は?
NAME=sam echo "$NAME" # empty
ここではeval
を使用しています。これは方法ですか?
NAME=sam eval 'echo $NAME' # => sam
これらは、異なるコマンドなどを移動する必要があります:
NAME=sam; echo "$NAME"
NAME=sam && echo "$NAME"
NAME
変数が渡された時点でので、空の文字列に展開$NAME
は、echo
を実行する前に、以前のシェルによって行われますecho
コマンドの環境では、展開はすでに完了しています(ヌル文字列に)。
1つのコマンドで同じ結果を得るために:
NAME=sam printenv NAME
'printenv'に関する注釈を追加しました。 @heemayl –
@AaronMcDaid冗長な 'env'を削除していただきありがとうございます。 – heemayl
'printenv'ベースのコマンドだけがOPのコマンドの意味を保持していることに注意してください。' NAME'を_コマンドスコープの環境変数として定義すると、呼び出されたコマンドとその子プロセスだけが見ることができます。他のコマンドは、非常に異なる何かを行います。つまり、 'NAME'をシェルのexit_until-current-shell-exitとして定義します。それ以降のすべての_shell_コマンドは参照しますが、_no external utilities_は表示しません。 – mklement0
これは、セミコロンで、あまりにも動作します。
NAME=sam; echo $NAME
構文
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になります。一緒に重要な明確化と、既存の答えを持って
:述べたように
、NAME=sam echo "$NAME"
の問題は割り当てNAME=sam
が有効になる前$NAME
が現在のシェルによって展開されることをです。 ((無効)溶液試行NAME=sam echo "$NAME"
の)元のセマンティクスを維持
ソリューション:
がeval
のいずれかを使用して、[1](質問自体のように) 、またはprintenv
(によって追加されるようアーロンheemayl's answerにMcDaid)、又はbash -c
(Ljm 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"
それらは同じ出力を生成するが、それらは代わり定義:
NAME
echo
が環境変数NAME
に頼っていたコマンドであれば、それは(以前と異なったり、潜在的に定義)に定義されない変数
注意外部のユーティリティと(非ソースの)スクリプト(export
またはdeclare -x
で環境変数としてマークされていない場合)。
(zsh
であるように)[1]技術的に、bash
ここでPOSIXに違反している:eval
組み込み特殊シェルであるので、先行NAME=sam
割り当ては可変$NAME
が残存させるべきですコマンドが終了した後でスコープ内にあるが、それは何が起こるかではない。
ただし、bash
をPOSIX互換モードで実行すると、はになります。
dash
およびksh
は常に準拠しています。
厳密なルールは複雑で、いくつかの側面は実装に任せて決定します。再びCommand Search and Executionを参照してください。
'NAME = sam echo whatever'は、シェルの' NAME'の値を変更しません。 – rici