通过环境变量更新 shell 函数和别名

通过环境变量更新 shell 函数和别名

假设我们在 中定义了以下 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 分配什么值都不会影响别名。

相反,函数在处理时不会评估环境变量。函数中的环境变量在调用函数时进行评估。

相关内容