我有一个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}它不是解决方案)。
答案 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#!/bin/bash
function ponOS {
echo "${FUNCNAME[1]}: hello from ponOS"
}
#!/bin/bash
source ./parasha_lib.sh
function main {
echo "message from ${FUNCNAME}"
ponOS
}
main
message from main
main: hello from ponOS