環境変数によるシェル関数とエイリアスの更新

環境変数によるシェル関数とエイリアスの更新

次のシェル関数とエイリアスを定義するとします.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 に割り当てる値は、エイリアスには影響しません。

対照的に、この関数は処理中に環境変数を評価しません。関数の環境変数は、関数が呼び出されたときに評価されます。

関連情報