Shell-Script

通過環境變數更新 shell 函式和別名

  • March 30, 2016

假設我們在 中定義了以下 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

看起來函式已更新,但別名未更新。這種行為是預期的嗎?如果是這樣,為什麼?

是的,這種行為是預期的。原因很簡單,您"…"在定義別名時使用了雙引號 ( ),從而允許參數替換。這導致$VARIABLE_B在定義別名而不是執行時被替換。

本質上,當寫

VARIABLE_B="original"
alias my_alias="print $VARIABLE_B"

zsh$VARIABLE_B在執行alias命令之前替換,如下所示:

alias my_alias="print original"

因此別名my_alias總是print original在執行之前被替換。

如果你想在執行時替換一個參數,你必須用單引號 ( '…') 或$用 a引用它\

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 時將替換為當時的值。

引用自:https://unix.stackexchange.com/questions/273201