bash FUNCNAME值扩展

时间:2011-10-04 15:38:37

标签: 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}它不是解决方案)。

2 个答案:

答案 0 :(得分:3)

为此,您需要将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手册页:

  

如果shell不是交互式的,则不会展开别名,除非使用shopt设置了expand_aliases shell选项

现在,在不更改test.sh的情况下,我们获得了所需的输出:

[me@home]$ ./test.sh
message from main
main: hello from ponOS

答案 1 :(得分:1)

请参阅http://www.gnu.org/software/bash/manual/bash.html#Bash-Variables

上的FUNCNAME

parasha_lib.sh

#!/bin/bash

function ponOS {
    echo "${FUNCNAME[1]}: hello from ponOS"
}

test.sh

#!/bin/bash

source ./parasha_lib.sh

function main {
    echo "message from ${FUNCNAME}"
    ponOS
}

main

结果./test.sh

message from main
main: hello from ponOS