我的目标:当我输入的内容不是有效的Unix命令时,它会被送到一个特殊的函数,而不是显示“未找到命令”消息。
我找到了this post,这让我到了那里。
trap 'if ! type -t $BASH_COMMAND >/dev/null; then special_function $BASH_COMMAND; fi' DEBUG
这允许我运行我的特殊功能。但是,之后仍会显示“未找到命令”错误。
有什么方法可以告诉Bash压制这条消息吗?无论是在这个命令中,还是在特殊功能内,都可以。谢谢!
答案 0 :(得分:1)
我唯一能想到的是重定向stderr。我不认为这是一个很好的解决方案,但可能是一个起点。类似的东西:
$BASH_COMMAND 3> /tmp/invalid
if [ -f /tmp/invalid ]; then
if [ $(grep -c "command not found" /tmp/invalid) -ne 0 ];
special_function $BASH_COMMAND
rm /tmp/invalid
fi
fi
似乎有点笨拙但可以适应一些改编。
答案 1 :(得分:1)
在ZSH;这可以通过将其添加到.zshrc
来实现setopt debugbeforecmd
trap 'if ! whence -w "$ZSH_DEBUG_CMD" >& /dev/null; then special_function $ZSH_DEBUG_COMMAND;fi' DEBUG
exec 2> >(grep -v "command not found" > /dev/stderr)
这将在bash中表现得非常奇怪;因为bash将提示发送给stderr(实际上,只有在按下Enter键后才能看到提示和你输入的任何内容)。另一方面,ZSH将提示符和stderr作为单独的流处理。
如果你能找到一种方法让bash将提示发送到其他位置(例如/ dev / tty),那么类似的东西也会在bash中起作用。
编辑:
似乎bash版本> 4具有command_notfound_handle
功能,可以做你想要的。您可以在〜/ .bashrc
command_notfound_handle {
special_function $1
# The command that was not found is passed as the first argument to the fn
}