Shell-Script
通過環境變數更新 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
看起來函式已更新,但別名未更新。這種行為是預期的嗎?如果是這樣,為什麼?
是的,這種行為是預期的。原因很簡單,您
"…"
在定義別名時使用了雙引號 ( ),從而允許參數替換。這導致$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
時將替換為當時的值。