一行环境变量为空

一行环境变量为空

为什么我的 zsh 会这样?

% MYVAR="hi" echo $MYVAR

% MYVAR="$(date)" echo $MYVAR

% export MYVAR="$(pwd)"
% echo $MYVAR
/Users/theonlygusti

为什么同一行环境变量显然没有设置?

答案1

在命令中

MYVAR="hi" echo $MYVAR

该变量在命令的环境中MYVAR设置。但是,该命令不使用此变量。当前 shell 扩展了命令行上的参数hiechoecho$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

相关内容