2011-10-04 47 views
2

我有一个lib文件。它有一个类似ponOS函数的包装类替换。我想在函数的函数ponOS名称中显示它从哪里调用。bash FUNCNAME值扩展

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

回答

3

为此,您需要将ponOS设置为别名,以便在主函数内调用${FUNCNAME},而不是在脚本来源时调用${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不是交互,除非expand_aliases外壳选择是使用禁用了javascript

现在设置,在不改变test.sh我们得到所需的输出:

[[email protected]]$ ./test.sh 
message from main 
main: hello from ponOS 
+0

+1不错的答案。 –

+0

谢谢格伦...... –