我怎样才能压制Unix的“命令未find”输出?

我的目标是:当我input的东西不是一个有效的Unix命令时,它会被送到一个特殊的function,而不是显示“Command not found”消息。

我发现这个post ,这让我一半在那里。

trap 'if ! type -t $BASH_COMMAND >/dev/null; then special_function $BASH_COMMAND; fi' DEBUG 

这允许我运行我的特殊function。 然而,“命令未find”的错误仍然出现之后。

有什么办法可以告诉Bash抑制这个信息? 无论是在这个命令中,还是在特殊函数中,都可以。 谢谢!

我唯一能想到的就是重定向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 

似乎有点笨拙,但可以适应一些适应。

在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作为单独的流处理提示和错误。

如果你可以找到一种方法来使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 }