如何在 zsh precmd 函数中获取命令的退出状态?

如何在 zsh precmd 函数中获取命令的退出状态?

我将 add-zsh-hook precmd 与一个函数一起使用,以便我可以在正在运行的命令周围添加一些上下文信息。

也就是说, precmd 函数的调用似乎没有提供任何参数或任何环境变量来确定前一个命令是否成功。很高兴知道这样我就可以对结果采取不同的行动。

样本:

_after() {
  printf 'args:%s\n' "$*" # nothing
  printf 'After\n'
  # env #: nothing useful here
}

autoload -U add-zsh-hook
add-zsh-hook precmd _after

答案1

最后一个命令的退出状态可以在precmd钩子中通过通常的$?和访问$status。请记住,只有挂钩中的第一个命令才能检索它。$?在钩子的第一行保存专用参数并不罕见precmd

my-precmd-hook() {
  local -i code=$?
  printf 'exit code of the previous command: %d\n' code
}

autoload -Uz add-zsh-hook
add-zsh-hook precmd my-precmd-hook

文档在这一点上不是很好,但它确实存在。

钩子函数

对于下面的函数,可以定义一个与_functions附加的函数同名的数组。此类数组中的任何元素都被视为要执行的函数的名称;它在$?与基本函数相同的上下文中执行,并使用相同的参数和相同的初始值。

precmd在每个提示之前执行。

因此,数组中的所有函数都以与主钩子precmd_functions相同的方式执行。文档没有明确说明这是主挂钩中最后一个命令的状态代码,但它是隐含的。如果不是最后一个命令的状态,$?precmd$?precmd$?必须记录在案。

进一步我们发现:

shell 函数add-zsh-hook提供了一种在数组中添加或删除函数的简单方法。

这意味着precmd安装的钩子也以与主钩子add-zsh-hook相同的方式执行。$?precmd

相关内容