为什么我的 zsh 会这样?
% MYVAR="hi" echo $MYVAR
% MYVAR="$(date)" echo $MYVAR
% export MYVAR="$(pwd)"
% echo $MYVAR
/Users/theonlygusti
为什么同一行环境变量显然没有设置?
答案1
在命令中
MYVAR="hi" echo $MYVAR
该变量在命令的环境中MYVAR
设置。但是,该命令不使用此变量。当前 shell 扩展了命令行上的参数hi
echo
echo
$MYVAR
打电话之前echo
。
因此,如果该MYVAR
变量事先不存在于 shell 中,则该命令将仅输出换行符。
在最后一个示例中,您在调用命令行上echo
的扩展之前在 shell 中设置了变量。$MYVAR
由于该变量被设置为此时的结果$(pwd)
(不需要导出),因此 shell$MYVAR
在调用之前会替换为该值echo
。
和...之间的不同
variable=value some-command
和
variable=value; some-command
或同等的
variable=value
some-command
是,在第一种情况下,变量被设置为 环境中的值some-command
,但不是在当前 shell 中,而在第二/第三种情况下,变量在当前 shell 中设置,然后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