当我执行以下脚本时
#!/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
它将始终显示第一次运行的行为。