在函数内部,如何获取该函数的任何脚本的文件名?
通过提示扩展,%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 :(得分:0)
您可以将名称作为参数传递。
~/.zshenv:
function start_timer() {
echo "File: `basename $@`" # <----
start_time=$(date +%s.%N)
}
~/.zshrc:
start_timer $0 # <----
# initialize interactive shell...
end_timer # "~/.zshrc took 2 seconds"
basename 仅删除最后一个斜杠之前的所有内容,以防您只想显示文件名。
我的测试:
File: aliases.zsh
took 0.0018649101257324219 seconds
并且 - 如果您自己调用脚本,您也可以使用time
作为前缀命令来打印执行时间。
$ time touch x
touch x 0.00s user 0.00s system 7% cpu 0.019 total
答案 1 :(得分:0)
至少在zsh 5.7.1中,ZSH_ARGZERO
变量将报告当前脚本的名称,即使调用该脚本的函数不同:
$ cat foo
function a_function_in_foo {
echo "ZSH_ARGZERO=$ZSH_ARGZERO"
}
$ cat bar
source foo
a_function_in_foo
$ zsh bar
ZSH_ARGZERO=bar
在http://zsh.sourceforge.net/Doc/Release/Parameters.html中记录为
ZSH_ARGZERO
如果调用zsh来运行脚本,则这是脚本的名称。否则,它是用来调用当前shell的名称。与设置POSIX_ARGZERO选项时的$ 0值相同,但始终可用。