zsh TRAPZERR - 运行命令

时间:2013-12-18 22:25:38

标签: 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
}

2 个答案:

答案 0 :(得分:2)

要在 not found命令上触发操作,您可以使用特殊的command_not_found_handler挂钩功能。这相当于bash的{​​{1}},但输入错误。

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

command_not_found_handle

答案 1 :(得分:0)

正如@shellter指出的那样,在TRAPZERR中,命令名称将在$_中找到,但是你需要在运行任何命令之前存储它,否则它将被覆盖:

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退出的情况相同):

$ asasdasd || :
zsh: command not found: asasdasd

因此,您可能想要使用command_not_found_handler的两个原因。