我有一个 lib 文件。它有一个类似于包装器的 ponOS
函数替代。我想在函数 ponOS 中显示调用它的函数名称。
$> cat ./parasha_lib.sh
#!/bin/bash
function ponOS {
echo "$1: hello from ponOS"
}
ponOS='ponOS ${FUNCNAME}'
但是,我发现这个解决方案并没有达到我想要的效果。
$> cat ./test.sh
#!/bin/bash
source ./parasha_lib.sh
function main {
echo "message from ${FUNCNAME}"
ponOS
}
main
所以,我已经
$> ./test.sh
message from main
: hello from ponOS
但我想得到这个:
$> ./test.sh
message from main
main: hello from ponOS
我应该做什么?
这里重要的事情之一是 ./test.sh 不应该被修改(ponOS ${FUNCNAME} 这不是解决方案)。
最佳答案
为此,您需要将 ponOS
设置为别名,以便在主函数内调用时展开 ${FUNCNAME}
,而不是在获取脚本时展开.
修改./parasha_lib.sh
为:
#!/bin/bash
function ponOS {
echo "$1: hello from ponOS"
}
shopt -s expand_aliases # enable alias expansion
alias ponOS='ponOS ${FUNCNAME}' # create an alias to call ponOS
请注意,需要 shopt -s Expand_aliases
才能启用别名扩展。来自 bash 联机帮助页:
Aliases are not expanded when the shell is not interactive, unless the expand_aliases shell option is set using shopt
现在,在不更改 test.sh
的情况下,我们得到了所需的输出:
[me@home]$ ./test.sh
message from main
main: hello from ponOS
关于bash FUNCNAME 值扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7650438/