2016-02-28 71 views
1

在函數內部,如何獲取調用該函數的任何腳本的文件名?zsh:獲取調用函數的腳本的文件名

通過提示擴展,%x提供了定義函數的文件的名稱。 %N提供了函數名稱。我如何獲得調用函數的文件名?

這將是有益的彙報我的每一個啓動腳本的運行時間,例如:

~/.zshenv:

function start_timer() { 
    start_time=$(date +%s.%N) 
} 
function stop_timer() { 
    stop_time=$(date +%s.%N) 
    elapsed_time=$((stop_time-start_time)) 
    echo "$SCRIPTNAME took $elapsed_time seconds" 
} 
start_timer 
# initialize env... 
end_timer # "~/.zshenv took 0 seconds" 

~/.zshrc:

start_timer 
# initialize interactive shell... 
end_timer # "~/.zshrc took 2 seconds" 

~/.zlogin:

start_timer 
# initialize login shell... 
end_timer # "~/.zlogin took 2 seconds" 
+0

這是[非常相似的問題](http://stackoverflow.com/questions/9901210),但也沒有真正的解決方案。 – Lucas

回答

0

您可以將該名稱作爲參數傳遞。

~/.zshenv:

function start_timer() { 
    echo "File: `basename [email protected]`"    # <---- 
    start_time=$(date +%s.%N) 
} 

~/.zshrc:

start_timer $0       # <---- 
# initialize interactive shell... 
end_timer # "~/.zshrc took 2 seconds" 

基名只在剝離的情況下,最後一個斜線之前,你只想要顯示的文件名的一切。

我的測試:

File: aliases.zsh 
took 0.0018649101257324219 seconds 

而且 - 如果你自己調用腳本,你也可以使用time作爲前綴命令來打印自己的執行時間。

$ time touch x 
touch x 0.00s user 0.00s system 7% cpu 0.019 total 
+0

當通過zsh初始化時,每個啓動文件中'$ 0'只是'zsh'。如果我直接將腳本名稱傳遞給函數,它會起作用,比如'end_time $ {(%): - %x}',但是你可以明白爲什麼我不想在每次調用時使用它。 – mgiuffrida

相關問題