私は例を挙げた。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
再定義したりしないのですか?echo
cat
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
、エイリアスは拡張されません。=
単語の区切り文字ではなく、変数の割り当てにおける変数と値の間の区切り記号だけです。