我正在尝试使用zsh触发TRAPZERR
函数中的某些内容。我需要一个尚未找到的命令,但无法找到获取它的方法。这是我第一次写zsh,如果很明显那就很抱歉
TRAPZERR() {
# catch the "not found" commands
if [ $? -eq 127 ]; then
# how to get the command that has been run?
fi
}
答案 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的两个原因。