调用新 shell 后执行 `set -xv`

调用新 shell 后执行 `set -xv`

以下命令有效

% DEBUGCLI=YES exec zsh             
% set -xv 
% echo debug
echo debug
+zsh:2> echo debug
debug

但是,当我尝试类似的事情时

% exec zsh -c 'set -xv'

它只是关闭终端。

我不想用exec zsh -xv。原因是这里

我正在寻找一个命令而不是两个命令,这样我就不必set -xvexec zsh.

是的,我已经尝试过

exec zsh ; set -xv& exec zsh && set -xv.这两个命令都忽略set -xv

答案1

zsh -c 'set -xv'告诉zsh运行包含set -xv.运行后set -xv,脚本完成并zsh退出(退出代码为set)。就像zsh -c uname跑步uname和完赛一样。

exec zsh ; set -xv告诉当前 shell 在当前进程中执行zsh,因此后面的任何命令都将永远不会被执行(无论如何,这只能在exec返回之后执行),因为 shell 将不再执行它们。

如果您想运行带有和选项的zsh交互式 shell ,则为:-v-x

zsh -xv

或者

zsh -o verbose -o xtrace

如果您想在您的环境中以交互方式运行set -xv,例如zshDEBUGCLI=YES你链接的答案建议您要做的事情,然后您可以添加:

if [[ $DEBUGCLI = YES ]]; then
  set -o xtrace -o verbose
fi

到您的,(如果您不希望 跟踪和记录~/.zshrc您的其余部分,则在最后一行)。~/.zshrc

无论如何,您可以运行set -xvand set +xv(或set -o xtrace -o verboseand set +o xtrace +o verbose)来打开或关闭调试,而不必每次都重新启动 shell。

如果您xtrace只想在执行您输入的代码期间生效(而不是在钩子或 zle 小部件中执行命令),则可以将其设置在钩子的末尾,并在钩子preexec()的开头取消设置precmd()(和set +x 2> /dev/null)。

相关内容