私のzshはなぜこのように動作しますか?
% MYVAR="hi" echo $MYVAR
% MYVAR="$(date)" echo $MYVAR
% export MYVAR="$(pwd)"
% echo $MYVAR
/Users/theonlygusti
環境変数が同じ行に設定されていないのはなぜですか?
答え1
指揮中
MYVAR="hi" echo $MYVAR
この変数はコマンド環境で設定されますMYVAR
。ただし、コマンドはこの変数を使用しません。現在のシェルはコマンドラインから引数を拡張します。hi
echo
echo
$MYVAR
電話する前にecho
。
したがって、MYVAR
変数が以前にシェルに存在しなかった場合、コマンドは改行のみを出力します。
最後の例では、echo
コマンドラインから拡張を呼び出す前にシェルで変数を設定しました。$MYVAR
この時点で変数が結果に設定されるため$(pwd)
(エクスポートは不要です)、シェルは$MYVAR
変数を呼び出す前にその値に置き換えますecho
。
間の違い
variable=value some-command
そして
variable=value; some-command
またはそれに対応する
variable=value
some-command
はい、最初のケースでは変数は現在のシェルではなく環境の値に設定されますがsome-command
、2番目または3番目の場合、変数は現在のシェルに設定され、呼び出さsome-command
れます。別の方法でエクスポートした場合、変数を使用したい場合は、variable
環境でも変数を使用できます。some-command
例:
$ unset -v var
他のコマンドの呼び出し中に変数を設定すると、コマンド環境に変数が設定されますが、ローカル環境には設定されません。
$ var=1 sh -c 'printf "var is %s\n" "$var"'
var is 1
$ printf 'var is %s\n' "$var"
var is
ローカル環境で変数を設定しますが、エクスポートせずにローカルに設定してください。
$ var=1; sh -c 'printf "var is %s\n" "$var"'
var is
$ printf 'var is %s\n' "$var"
var is 1
子プロセスで使用できるように変数をエクスポートします。
$ export var
$ sh -c 'printf "var is %s\n" "$var"'
var is 1
気づく
MYVAR=$(pwd)
同じですか?
MYVAR=$PWD