Bash zsh TRAPZERR-get命令运行

Bash zsh TRAPZERR-get命令运行,bash,zsh,Bash,Zsh,我试图用zsh在TRAPZERR函数中触发一些东西。我需要尚未找到但无法找到方法获取的命令。这是我第一次写zsh,很抱歉,如果这是显而易见的 TRAPZERR() { # catch the "not found" commands if [ $? -eq 127 ]; then # how to get the command that has been run? fi } 要在未找到命令时触发操作,可以使用特殊的钩子函数。这相当于bash的命令\u未

我试图用zsh在
TRAPZERR
函数中触发一些东西。我需要尚未找到但无法找到方法获取的命令。这是我第一次写zsh,很抱歉,如果这是显而易见的

TRAPZERR() {
    # catch the "not found" commands
    if [ $? -eq 127 ]; then
        # how to get the command that has been run?
    fi
}

要在未找到命令时触发操作,可以使用特殊的钩子函数。这相当于
bash
命令\u未找到\u句柄
,但排印错误已修复

请注意,该函数是在子shell上下文中执行的,因此您在其中设置的任何变量都不会被父shell看到

$ command_not_found_handler() print -ru2 -- $1 was not found
$ asdasd
asdasd was not found

正如@Sheller所指出的,在
TRAPZERR
中,命令名将在
$\uu
中找到,但您需要在运行任何命令之前存储它,否则,它将被覆盖:

TRAPZERR() {
  local cmd=$_ code=$?
  if (( code == 127 )); then
    print -ru2 -- "Most probably, $cmd was not found"
  fi
}
但要注意:

$ asdasda
zsh: command not found: asdasda
Most probably, asdasda was not found
$ (asdad)
zsh: command not found: asdad
Most probably, asdad was not found
Most probably,  was not found
上面,127是
asdad
的退出状态,也是子shell的退出状态,因此有两条消息

还请注意,有些上下文未调用
TRAPZERR
(与
set-e
不会导致shell退出的上下文相同):


因此,有两个原因可以解释为什么您可能要使用它。

zsh是否支持
$\uuz
变量。在其他shell中,这是最近执行的命令,但我不确定这是否适用于脚本,还是仅适用于cmd行。也。最好执行类似于拼写错误的cmdname的操作;myRc=$?;TRAPZERR$$myRc并在函数中使用另一个本地变量,而不是
$?
。执行的任何命令都会重置
$?
的值。祝你好运。@Sheller$只给我一个]。我没有遵循myRc=$?我怎么用这个?我看不懂。请使用背面的勾号将上面的“示例代码”之类的项目括起来,如
$\uu
。我的意思是用一个特殊变量捕捉任何重要cmd的返回代码,比如
goodCmd;cmd1rc=$?;拼写错误的cmd;cmd2rc=$?
。今天就要起飞了。我回家后可能会去看看S.O。祝你好运。为什么不使用?@StephaneChazelas完美!我不知道这个函数。你能把这个写下来回答我吗?谢谢
$ asasdasd || :
zsh: command not found: asasdasd