我已经在 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
错误。
哈!