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)
这是预期的行为,手册中解释如下:
别名会在读取函数定义时展开,而不是在执行函数时展开,因为函数定义本身就是一个命令。
在这种情况下,这意味着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 脚本中使用别名。功能好多了。