以下命令有效
% DEBUGCLI=YES exec zsh
% set -xv
% echo debug
echo debug
+zsh:2> echo debug
debug
但是,当我尝试类似的事情时
% exec zsh -c 'set -xv'
它只是关闭终端。
我不想用exec zsh -xv
。原因是这里。
我正在寻找一个命令而不是两个命令,这样我就不必set -xv
在exec 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
,例如zsh
DEBUGCLI=YES
你链接的答案建议您要做的事情,然后您可以添加:
if [[ $DEBUGCLI = YES ]]; then
set -o xtrace -o verbose
fi
到您的,(如果您不希望 跟踪和记录~/.zshrc
您的其余部分,则在最后一行)。~/.zshrc
无论如何,您可以运行set -xv
and set +xv
(或set -o xtrace -o verbose
and set +o xtrace +o verbose
)来打开或关闭调试,而不必每次都重新启动 shell。
如果您xtrace
只想在执行您输入的代码期间生效(而不是在钩子或 zle 小部件中执行命令),则可以将其设置在钩子的末尾,并在钩子preexec()
的开头取消设置precmd()
(和set +x 2> /dev/null
)。