2016-02-28 33 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

相关问题