在没有 PackageKit 的情况下处理未找到命令

在没有 PackageKit 的情况下处理未找到命令

我已经在 Fedora 上卸载了 PackageKit,因为我不需要命令行的膨胀和竞争条件。

从那时起,command-not-found 失败并显示以下内容:

❯ foo
bash: foo: command not found...
Failed to search for file: GDBus.Error:org.freedesktop.DBus.Error.NameHasNoOwner: Could not activate remote peer.
# because...
❯ dbus-send --system --print-reply  --dest=org.freedesktop.PackageKit  \
    /org/freedesktop/PackageKit org.freedesktop.DBus.Properties.Get  \  
    string:'org.freedesktop.PackageKit' string:'BackendName'

Error org.freedesktop.DBus.Error.NameHasNoOwner: Could not activate remote peer.

如果没有 PackageKit,如何保留命令未找到的功能?看来dnf应该可以自己解决这个问题?

版本:

  • Fedora 31 beta + gnome-shell 3.34.0 + zsh 5.7.1
  • PackageKit-command-not-found-1.1.12-11.fc31.x86_64.rpm

答案1

呃,这个问题困扰了我很多年。像其他许多人一样,我PackageKit 并已竭尽全力将其关闭。我还发现您不能在没有重大影响的情况下卸载它。您能做的最好的事情就是禁用并屏蔽它的 systemctl 服务,以防止它突然将大量软件包下载到已经满的硬盘上。相反,我仅依靠命令行 DNF 来处理任何软件包和系统升级。

所以,每次我用粗手指输入诸如“mkae”(对于那些可以正确输入的人来说是“make”)之类的命令时,我通常都会忍受这种“烦人的功能”。

我不是一个通常会放弃并生活在这样的烦恼中的人,我今天终于花时间去深入研究它......我意识到这是来自 bash 的一个功能。但是,我无法理解 Fedora 会调整 bash对于 PackageKit 来说就很重要了。但是,我也找不到任何关于这个主题的搜索结果(尽管我确实发现很多其他人似乎也对 PackageKit 感到恼火,所以显然我并不孤单)。当我发现这篇文章时,我一时兴奋不已,但很快就因缺乏任何答案而感到失望!

所以,我深入研究了它。我确实非常了解 bash,并决定从搜索手册页开始。这最终导致了这个简单的答案......

事实证明,bash(以及其他一些 shell,如 zsh)有一个command_not_found_handle函数,可以在未找到任意命令时调用该函数。事实证明,PackageKit 在 /etc/profile.d 下安装了一个定义此函数的文件。它是/etc/profile.d/PackageKit.sh

查看其中函数的版本会产生几种不同的禁用方法:

  • 您可以删除 /etc/profile.d/PackageKit.sh (尽管它可能会在软件包更新时显示出来)。
  • 删除可执行权限/usr/libexec/pk-command-not-found(同样,可能会在软件包更新时恢复)。
  • 删除(或重命名)目录/usr/libexec/packagekitd(并且可能会在软件包更新时重新安装)。
  • 添加unset -f command_not_found_handle到本地 .bashrc 文件
  • 最后,在本地 .bashrc 文件中定义您自己的超级棒的“自定义”函数command_not_found_handle(如上面的评论中提到的)。我已经开始走这条路,但后来决定好的旧“命令未找到”可能是最好的......

因为,当我尝试完全删除 PackageKit 时遇到了很多问题,我只需将其保留在适当的位置并使其禁用和屏蔽。因此,我采取了最简单的方法,即在本地 .bashrc 中取消设置该函数,现在我很高兴不再看到愚蠢且令人讨厌的GDBus.Error:org.freedesktop.DBus.Error.NameHasNoOwner错误。

哈!

相关内容