zsh:获取调用函数的脚本的文件名

mgi*_*ida 4 zsh zshrc

在函数内部,如何获取调用该函数的任何脚本的文件名?

通过提示扩展,%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"
Run Code Online (Sandbox Code Playgroud)

~/.zshrc:

start_timer
# initialize interactive shell...
end_timer # "~/.zshrc took 2 seconds"
Run Code Online (Sandbox Code Playgroud)

~/.zlogin:

start_timer
# initialize login shell...
end_timer # "~/.zlogin took 2 seconds"
Run Code Online (Sandbox Code Playgroud)

bsc*_*ter 6

至少在 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
Run Code Online (Sandbox Code Playgroud)

它在http://zsh.sourceforge.net/Doc/Release/Parameters.html中记录为

ZSH_ARGZERO

如果调用 zsh 来运行脚本,则这是脚本的名称。否则,它是用于调用当前 shell 的名称。这与设置 POSIX_ARGZERO 选项时 $0 的值相同,但始终可用。