web-dev-qa-db-ja.com

環境変数を印刷/エコーする方法は?

設定されたばかりの環境変数を印刷するにはどうすればよいですか?

NAME=sam echo "$NAME" # empty

evalを使用してここで確認できます。これは道ですか?

NAME=sam eval 'echo $NAME' # => sam
43
ThomasReggi

これらは異なるコマンドとして実行する必要があります。例:

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

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

1つのコマンドで同じ結果を取得するには:

NAME=sam printenv NAME
48
heemayl

重要な説明とともに既存の回答をまとめるには:

前述のように、NAME=sam echo "$NAME"の問題は、$NAMEが現在のシェルによって拡張されることですbefore割り当てNAME=samが有効になります。

元のセマンティクスを保持するソリューション((無効な)ソリューション試行NAME=sam echo "$NAME"):

evalのいずれかを使用します[1] (質問自体のように)、またはprintenv(Aaron McDaidが heemayl's answer に追加したもの)、またはbash -c(from 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"

同じoutputを生成しますが、代わりに以下を定義します。

  • a Shell variable NAME(のみ)environment variable [ではなく。 ____。]
    • echoenvironment variable NAMEに依存するコマンドである場合、定義されません(または以前とは異なる方法で定義される可能性があります)。
  • thatlives onコマンドの後。

すべての環境変数もシェル変数として公開されますが、その逆は真ではないことに注意してください。シェル変数は現在のシェルとそのサブシェルにのみ表示されますが、外部ユーティリティなどの子プロセスにはnotおよび(非ソース)スクリプト(exportまたはdeclare -xで環境変数としてマークされていない場合)。


[1]技術的には、bashはPOSIXに違反しています(zshと同様):evalspecial Shell built-inであるため、前のNAME=samの割り当てにより、コマンドの終了後も変数$NAMEがスコープ内に留まるはずですが、それは起こりません。
ただし、bashをPOSIX互換モードで実行すると、isに準拠します。
dashおよびkshは常に準拠しています。
正確なルールは複雑であり、いくつかの側面は実装の決定に任されています。再度、 コマンドの検索と実行 を参照してください。
また、通常の免責事項が適用されます: 完全に制御する入力または暗黙的に信頼する入力でのみevalを使用

8
mklement0

構文

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番目のエコーで3になります。

2
Ljm Dullaart

これも、セミコロンで機能します。

NAME=sam; echo $NAME

2
ThomasReggi