![Bash 脚本的意外行为:首先执行函数,然后执行别名](https://linux22.com/image/149277/Bash%20%E8%84%9A%E6%9C%AC%E7%9A%84%E6%84%8F%E5%A4%96%E8%A1%8C%E4%B8%BA%EF%BC%9A%E9%A6%96%E5%85%88%E6%89%A7%E8%A1%8C%E5%87%BD%E6%95%B0%EF%BC%8C%E7%84%B6%E5%90%8E%E6%89%A7%E8%A1%8C%E5%88%AB%E5%90%8D.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
,即在同一 shell 中运行多次时,才会出现不同的行为。当您在单独的 shell 中运行它时,./Sample.sh
它将始终显示第一次运行的行为。