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,即在同一 shell 中运行多次时,才会出现不同的行为。当您在单独的 shell 中运行它时,./Sample.sh它将始终显示第一次运行的行为。

相关内容