我注意到一个例子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
实际上是重新定义别名命令bar
。这就像 nameref 一样,即具有引用属性的变量。
我对以下示例进行了更多实验。
为什么
mya=cat
不重新别名mya
为cat
,也不重新定义别名echo
为cat
?为什么要
mya () { cat test.sh; }
重新定义函数的别名echo
,就像 nameref 一样?
谢谢。
$ 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
,因此别名不会扩展。=
不是单词分隔符,它只是变量赋值中变量和值之间的分隔符。