![当我输入一个不存在的命令时,我的机器会停顿大约 5 秒钟,然后才返回到 shell 提示符](https://linux22.com/image/512573/%E5%BD%93%E6%88%91%E8%BE%93%E5%85%A5%E4%B8%80%E4%B8%AA%E4%B8%8D%E5%AD%98%E5%9C%A8%E7%9A%84%E5%91%BD%E4%BB%A4%E6%97%B6%EF%BC%8C%E6%88%91%E7%9A%84%E6%9C%BA%E5%99%A8%E4%BC%9A%E5%81%9C%E9%A1%BF%E5%A4%A7%E7%BA%A6%205%20%E7%A7%92%E9%92%9F%EF%BC%8C%E7%84%B6%E5%90%8E%E6%89%8D%E8%BF%94%E5%9B%9E%E5%88%B0%20shell%20%E6%8F%90%E7%A4%BA%E7%AC%A6.png)
当我输入不存在的命令时,它会显示“未找到命令。”然后等待大约 5 秒钟才再次显示提示。
我该如何修复它?
我正在使用 Fedora。
答案1
检查您的路径是否不包含“按需安装”网络共享。此外,我的 Ubuntu 安装了一个东西,如果您输入现有但尚未安装的命令的名称,它会说“您需要安装软件包 foo”。我不记得是什么在做这件事,但它显然必须对整个软件包数据库进行某种搜索,这可能会很耗时。
如果您使用 bash,请输入“set”并查找名为“command_not_found_handle()”的函数。这就是 bash 在找不到命令时运行的函数。
答案2
这听起来像是您安装了 PackageKit-command-not-found 软件包。安装后,如果您输入不存在的命令,它会告诉您“未找到命令”,然后搜索您的软件包存储库以确定是否有可用的软件包包含您输入的命令。如果找到软件包,它会提示您下载,否则它会返回到命令提示符。
如果您不需要该功能,可以通过运行“sudo yum remove PackageKit-command-not-found”删除 PackageKit-command-not-found 包
答案3
我认为 Paul 关于路径中自动挂载网络共享的想法很可能是它挂起的地方。查看它挂起位置的最简单方法是查看进程挂起的系统调用。strace
是跟踪系统调用的工具,例如:
`strace bash -c 'non_existent_command'`
....
stat64("/mnt/remotebin", 0xbfad11e0) = -1 ENOENT (No such file or directory) #Hangs here Maybe?
...
如果它挂在路径中的某个自动挂载上,您可以使用以下方法过滤输出:
strace -e trace=stat64 bash -c 'non_existent_command'
但我认为最好从显示所有系统调用的那个开始。
答案4
我相信这个答案也回答了原来的问题:How do I fix that?
我喜欢这个问题的答案,但由于我只想要一个快速修复而不想调查原因并且不想等待 5 秒,所以我只是在自己的 .bash_aliases(源自 .bashrc)中创建了自己的函数并返回未知命令以提供即时反馈而无需等待。
对我来说很管用,我很高兴。希望它能帮助别人。
command_not_found_handle() {
echo "command not found: ${1}"
}