設定されたばかりの環境変数を印刷するにはどうすればよいですか?
NAME=sam echo "$NAME" # empty
eval
を使用してここで確認できます。これは道ですか?
NAME=sam eval 'echo $NAME' # => sam
これらは異なるコマンドとして実行する必要があります。例:
NAME=sam; echo "$NAME"
NAME=sam && echo "$NAME"
空の文字列への$NAME
の展開は、echo
を実行する前に、以前にシェルによって行われているため、NAME
変数がecho
コマンドの環境に渡されると、展開既に行われています(ヌル文字列へ)。
1つのコマンドで同じ結果を取得するには:
NAME=sam printenv NAME
重要な説明とともに既存の回答をまとめるには:
前述のように、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を生成しますが、代わりに以下を定義します。
NAME
(のみ)environment variable [ではなく。 ____。]echo
がenvironment variable NAME
に依存するコマンドである場合、定義されません(または以前とは異なる方法で定義される可能性があります)。すべての環境変数もシェル変数として公開されますが、その逆は真ではないことに注意してください。シェル変数は現在のシェルとそのサブシェルにのみ表示されますが、外部ユーティリティなどの子プロセスにはnotおよび(非ソース)スクリプト(export
またはdeclare -x
で環境変数としてマークされていない場合)。
[1]技術的には、bash
はPOSIXに違反しています(zsh
と同様):eval
はspecial Shell built-inであるため、前のNAME=sam
の割り当てにより、コマンドの終了後も変数$NAME
がスコープ内に留まるはずですが、それは起こりません。
ただし、bash
をPOSIX互換モードで実行すると、isに準拠します。dash
およびksh
は常に準拠しています。
正確なルールは複雑であり、いくつかの側面は実装の決定に任されています。再度、 コマンドの検索と実行 を参照してください。
また、通常の免責事項が適用されます: 完全に制御する入力または暗黙的に信頼する入力でのみeval
を使用 。
構文
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になります。
これも、セミコロンで機能します。
NAME=sam; echo $NAME