我的目标是:当我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 }