为什么别名有时像 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实际上是重新定义别名命令bar。这就像 nameref 一样,即具有引用属性的变量。

我对以下示例进行了更多实验。

  • 为什么mya=cat不重新别名myacat,也不重新定义别名echocat

  • 为什么要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,因此别名不会扩展。=不是单词分隔符,它只是变量赋值中变量和值之间的分隔符。

相关内容