Bash 스크립트의 예기치 않은 동작: 함수가 먼저 실행된 다음 별칭이 실행됨

Bash 스크립트의 예기치 않은 동작: 함수가 먼저 실행된 다음 별칭이 실행됨

다음 스크립트를 실행할 때

#!/usr/bin/env bash

main() {
    shopt -s expand_aliases 
    alias Hi='echo "Hi from alias"'
    Hi  # Should Execute the alias
    \Hi # Should Execute the function
    "Hi"
}

function Hi() {
    echo "Hi from function"
}
main "$@"

함수를 먼저 실행한 다음 항상 별칭으로 실행합니다.

$ . Sample.sh
Hi from function
Hi from function
Hi from function
$ . Sample.sh
Hi from alias
Hi from function
Hi from function

왜 그럴까요?


다음과 같은 경우에는 이런 일이 발생하지 않습니다.

#!/usr/bin/env bash

function Hi() {
    echo "Hi from function"
}

shopt -s expand_aliases 
alias Hi='echo "Hi from alias"'
Hi  # Should Execute the alias
\Hi # Should Execute the function
"Hi"

함수를 먼저 실행한 다음 항상 별칭으로 실행합니다.

$ . Sample.sh
Hi from alias
Hi from function
Hi from function
$ . Sample.sh
Hi from alias
Hi from function
Hi from function

답변1

함수 내의 별칭 확장은 함수가 실행될 때가 아니라 함수를 읽을 때 이루어집니다. 함수의 별칭 정의는 함수가 실행될 때 실행됩니다.

바라보다별칭 및 기능
그리고https://www.gnu.org/software/bash/manual/html_node/Aliases.html

이는 함수가 실행될 때 별칭이 main정의되지만 함수를 처음 읽을 때 별칭이 아직 정의되지 않았음을 의미합니다. 따라서 첫 번째 함수는 함수를 세 번 main실행합니다 .Hi

스크립트를 두 번째로 가져오면 별칭은 이전 실행에서 이미 정의되어 있으며 함수 정의를 읽을 때 확장될 수 있습니다. 지금 함수를 호출하면 확장 별칭으로 실행됩니다.

. Sample.sh다른 동작은 스크립트가 시작될 때만 발생합니다 . 즉, 동일한 셸에서 여러 번 실행됩니다. 별도의 셸에서 실행하면 ./Sample.sh항상 첫 번째 실행의 동작이 표시됩니다.

관련 정보