【问题标题】:How can I suppress Unix's "command not found" output?如何抑制 Unix 的“找不到命令”输出?
【发布时间】:2013-04-08 14:11:00
【问题描述】:

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

我找到了this post,这让我走到了一半。

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

这允许我运行我的特殊功能。但是之后仍然出现“找不到命令”错误。

有什么方法可以告诉 Bash 禁止显示该消息?无论是在这个命令中,还是在特殊函数中,都可以。谢谢!

【问题讨论】:

  • "type -t" 带有任何参数,即使使用 Bash 3.0 也不会产生任何错误。你确定你使用的是 bash 吗?或者也许 special_function 是没有找到的那个?
  • 感谢您的回复。肯定有特殊功能(我在我的一个演示中使用了 echo :),是的,我使用的是 Bash,但也许错误是因为我在 Mac 上?
  • 不知道是不是 Mac 的问题。顺便说一句,我得到的“找不到命令”消息是一个小案例:“bash:fdasfa:找不到命令”,而不是“找不到命令”。你真的应该确保你正在运行 bash。尝试在脚本运行时部分的某处插入 echo "$BASH_VERSION" >~/bash_version.txt。然后在您能够运行它后检查发送到该文件的输出。

标签: bash unix command-line stdout


【解决方案1】:

我唯一能想到的就是重定向标准错误。我认为这不是一个很好的解决方案,但可能是一个起点。比如:

$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

看起来有点笨拙,但可以进行一些调整。

【讨论】:

  • 非常聪明的主意。但是我将如何在每个命令之后运行它。嗯,也许有一种方法可以将它封装为我的特殊功能中的一个层?我的大脑很痛:)
  • 谢谢,让我想一想,看看能不能改进。需要某种方式通过此函数重定向每个 bash 命令,这可能很棘手。
【解决方案2】:

在 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
}

【讨论】:

  • command_notfound_handle 可以在 bash 中使用,如果您的 bash 版本 > 4 也可以这样做。我认为 ubuntu 为它定义了一些东西;但我对ubuntu不是很熟悉。所以我可能是错的。
猜你喜欢
  • 2012-07-12
  • 2021-12-03
  • 2015-12-22
  • 1970-01-01
  • 2012-01-05
  • 1970-01-01
  • 2010-10-11
  • 2021-12-17
  • 2011-06-07
相关资源
最近更新 更多