zsh:setopt in function并使其坚持下去

时间:2014-11-26 00:28:24

标签: profiling zsh

我试图在函数内部的.zshrc中添加分析:

# via http://stackoverflow.com/a/4351664/329700
profile_startup() {
    PS4='+$(/usr/local/bin/gdate "+%s:%N") %N:%i> '
    echo "profiling away"
    typeset -g PS4='%D{%.} %N:%i> '
    exec 3>&2 2>$HOME/tmp/startlog.$$
    setopt xtrace prompt_subst
}
profile_startup

当我这样运行时,/ tmp / startlog为空(没有记录任何内容)。但是当我在一个函数之外运行它时,在裸zshrc:

PS4='+$(/usr/local/bin/gdate "+%s:%N") %N:%i> '
echo "profiling away"
typeset -g PS4='%D{%.} %N:%i> '
exec 3>&2 2>$HOME/tmp/startlog.$$
setopt xtrace prompt_subst

这会在日志中添加大量分析数据。

为什么在运行函数内部的命令时没有记录任何日志数据? setopt命令不粘吗?我尝试将setopt no_local_options添加到profile_startup命令的末尾,然后只有一个日志命令写入文件 - 添加setopt no_local_options的行。

1 个答案:

答案 0 :(得分:1)

根据zsh documentation

  

LOCAL_OPTIONS <K>

     

如果在shell函数的返回点设置了此选项,则会恢复在进入函数时生效的大多数选项(包括此选项);未还原的选项为PRIVILEGEDRESTRICTED否则,只会恢复此选项,并恢复LOCAL_LOOPSXTRACEPRINT_EXIT_VALUE选项

clever way to work around this

profile_startup() {
    # do whatever ...
    trap 'setopt xtrace' EXIT
}