如何抑制Unix的“未找到命令”输出?

时间:2013-04-16 08:45:36

标签: bash unix command-line stdout

我的目标:当我输入的内容不是有效的Unix命令时,它会被送到一个特殊的函数,而不是显示“未找到命令”消息。

我找到了this post,这让我到了那里。

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

这允许我运行我的特殊功能。但是,之后仍会显示“未找到命令”错误。

有什么方法可以告诉Bash压制这条消息吗?无论是在这个命令中,还是在特殊功能内,都可以。谢谢!

2 个答案:

答案 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
}
相关问题