エイリアスが時々namerefのように動作し、時には動作しないのはなぜですか?

エイリアスが時々namerefのように動作し、時には動作しないのはなぜですか?

私は例を挙げた。https://unix.stackexchange.com/a/383825/674

$ alias foo=bar
$ foo () { blah "$@"; }
$ type -a foo bar  
foo is aliased to `bar'
bar is a function
bar ()
{
    blah "$@"
}

したがって、エイリアスをオーバーライドすることは、foo実際にaliasコマンドをオーバーライドすることですbar。これは、参照属性を持つ変数namerefと同じです。

次の例でさらに実験を行いました。

  • なぜエイリアスをmya=cat現実化myaしたりcat再定義したりしないのですか?echocat

  • namerefのようなmya () { cat test.sh; } 関数エイリアスをオーバーライドするのはなぜですか?echo

ありがとうございます。

$ alias mya=echo
$ type mya
mya is aliased to `echo'
$ mya abc  # mya behaves exactly as echo
abc

$ mya=cat
$ type mya
mya is aliased to `echo'
$ mya test.sh # mya=cat doesn't alias mya to cat
test.sh


$ mya () { cat test.sh; }
$ type mya
mya is aliased to `echo'
$ mya  # Redefining mya as a function works, by outputing the content of test.sh
#! /usr/bin/env bash
echo $_
echo $0
$ echo # Redefining mya also redefines the aliased echo, just like a nameref
#! /usr/bin/env bash
echo $_
echo $0

答え1

エイリアスがコマンドの最初の単語の場合は拡張されます。したがって、次のように入力するとき:

alias foo=bar
foo () { blah "$@"; }

エイリアスはfoo拡張され、入力したかのように処理されます。

bar () { blah "$@"; }

入力するとき:

alias mya=echo
mya=cat

コマンドの最初の単語はではmya=catないためmya、エイリアスは拡張されません。=単語の区切り文字ではなく、変数の割り当てにおける変数と値の間の区切り記号だけです。

関連情報