函数内的别名

FH0*_*FH0 3 bash alias sh

bash -c 'shopt -s expand_aliases

a() {
    alias myfunc="echo myfunc"
}

main() {
    a
    myfunc
}

main'
Run Code Online (Sandbox Code Playgroud)

afunction用于给一些命令起别名,这些命令在mainfunction中使用。

输出:

environment: line 8: myfunc: command not found
Run Code Online (Sandbox Code Playgroud)

ogu*_*ail 5

这是预期的行为,手册中解释如下:

别名会在读取函数定义时展开,而不是在执行函数时展开,因为函数定义本身就是一个命令。

在这种情况下,这意味着myfuncinmain不会扩展为 ,echo myfunc除非您的脚本调用 a将其定义在 的定义之上main

在调用函数之前,shell 不会执行函数定义内的命令。所以,a上面的定义main没有任何区别;myfunc直到被调用才被定义a

比较这两个:

$ bash -O expand_aliases -c '
foo() { bar; }
alias bar=uname
foo'
environment: line 1: bar: command not found
Run Code Online (Sandbox Code Playgroud)
$ bash -O expand_aliases -c '
alias bar=uname
foo() { bar; }
foo'
Linux
Run Code Online (Sandbox Code Playgroud)

解决方法是避免在 shell 脚本中使用别名。功能好多了。