bash FUNCNAME 值扩展

标签 bash

我有一个 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/

相关文章:

linux - 根据 bash 或 awk 中一行中的值对列重新排序

bash - AWK:将值返回给 shell 脚本

bash - 在 qmake 脚本中调用 sed

c - 带有循环的 Makefile

bash - 如何将 $* 放入 bash 数组中

bash - 在 Jenkins 中的构建步骤之间传递数据

linux - trap命令解释

Bash - SSH 多个命令,它们之间有延迟

linux - 将两个或多个 STDOUT 重定向到单个 STDIN

linux - 将文件从 Amazon S3 同步到本地