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

时间:2016-02-28 01:43:45

标签: 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"

~/.zshrc:

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

~/.zlogin:

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

2 个答案:

答案 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值相同,但始终可用。