별칭이 때로 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이므로 별칭이 확장되지 않습니다. =단어 구분 기호가 아니라 변수 할당에서 변수와 값 사이의 구분 기호일 뿐입니다.

관련 정보