次のシェル関数とエイリアスを定義するとします.zshenv
。
export VARIABLE_A='original'
function my_function()
{
print $VARIABLE_A
}
export VARIABLE_B='original'
alias my_alias="print $VARIABLE_B"
それでは、新しいインタラクティブシェルを起動し、次のことを行うとしましょう。
$ 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に次のシェル関数とエイリアスを定義するとします。
エイリアスは、スクリプトの実行時に評価されます。したがって、$ VARIABLE_Bは.zshenvが処理されたときに評価され、その値に置き換えられます。後で VARIABLE_B に割り当てる値は、エイリアスには影響しません。
対照的に、この関数は処理中に環境変数を評価しません。関数の環境変数は、関数が呼び出されたときに評価されます。