2011-10-04 78 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

謝謝格倫...... –