假设我们在 中定义了以下 shell 函数和别名.zshenv
:
export VARIABLE_A='original'
function my_function()
{
print $VARIABLE_A
}
export VARIABLE_B='original'
alias my_alias="print $VARIABLE_B"
现在,假设我们启动一个新的交互式 shell,然后执行以下操作:
$ my_function
$ export VARIABLE_A='new'
$ my_function
$ my_alias
$ export VARIABLE_B='new'
$ my_alias
上面的命令打印:
original
new
original
original
看起来函数已更新,但别名没有更新。这种行为是预期的吗?如果是这样,为什么?
答案1
是的,该行为是预期的。原因很简单,您"…"
在定义别名时使用了双引号 (),从而允许参数替换。这导致$VARIABLE_B
在定义别名而不是执行别名时被替换。
本质上,写作时
VARIABLE_B="original"
alias my_alias="print $VARIABLE_B"
zsh
$VARIABLE_B
将在运行命令之前替换alias
,如下所示:
alias my_alias="print original"
因此,在执行之前,别名my_alias
将始终被替换。print original
如果要在执行时替换参数,则必须用单引号 ( '…'
) 或用$
: 引用它\
:
alias my_alias='print $VARIABLE_B'
alias my_alias="print \$VARIABLE_B"
这将设置别名,以便变量名仍然是命令的一部分,并且别名实际上在执行之前my_alias
被替换。print $VARIABLE_B
相反,函数定义内的参数不需要显式引用,它们始终仅在运行时替换。
所以写的时候
my_function () {
{
print $VARIABLE_A
}
这正是将要存储的内容。当运行时my_function
$VARIABLE_A
将被替换为当时的值。
答案2
假设我们在 .zshenv 中定义了以下 shell 函数和别名:
别名是在脚本执行时评估的。因此,$VARIABLE_B 会在处理 .zshenv 时被评估并替换为它的值。无论您稍后为 VARIABLE_B 分配什么值都不会影响别名。
相反,函数在处理时不会评估环境变量。函数中的环境变量在调用函数时进行评估。