我从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
?
为什么像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
当别名是命令中的第一个单词时,别名将被扩展。因此,当您键入:
alias foo=bar
foo () { blah "$@"; }
别名foo
已展开,因此将其视为您键入的内容:
bar () { blah "$@"; }
当您输入时:
alias mya=echo
mya=cat
命令中的第一个单词是mya=cat
,而不仅仅是mya
,因此别名不会扩展。=
不是单词定界符,它只是变量赋值中变量和值之间的定界符。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句