![Bash 스크립트의 예기치 않은 동작: 함수가 먼저 실행된 다음 별칭이 실행됨](https://linux55.com/image/149277/Bash%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%9D%98%20%EC%98%88%EA%B8%B0%EC%B9%98%20%EC%95%8A%EC%9D%80%20%EB%8F%99%EC%9E%91%3A%20%ED%95%A8%EC%88%98%EA%B0%80%20%EB%A8%BC%EC%A0%80%20%EC%8B%A4%ED%96%89%EB%90%9C%20%EB%8B%A4%EC%9D%8C%20%EB%B3%84%EC%B9%AD%EC%9D%B4%20%EC%8B%A4%ED%96%89%EB%90%A8.png)
다음 스크립트를 실행할 때
#!/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
항상 첫 번째 실행의 동작이 표시됩니다.