我在本周早些时候正式公开发布当天升级到了 Fedora 26,长话短说,最终搞砸了我的安装,所以我进行了部分重新格式化。我的磁盘布局如下:
# df -h | grep dev
/dev/sdb3 40G 5.6G 32G 15% /
/dev/sdb2 477M 138M 311M 31% /boot
/dev/sdb1 200M 34M 167M 17% /boot/efi
/dev/sda2 9.8G 940M 8.4G 10% /var
/dev/sda1 493G 441G 27G 95% /home
/dev/sdb
是安装 root 的 SSD,/dev/sda
是我有分区的普通 HDD /home
。我决定对 Fedora 26 进行全新安装,而不是尝试通过 修复失败的升级dnf
,因此我重新格式化了/dev/sdb
SSD 中的所有分区,并重新安装了 Fedora 26,保持/home
分区完好无损。安装进行得很顺利,一切似乎都再次正常工作,除了一件事:Zhs 自动完成现在对于较大的目录来说非常慢。
Zsh 是我的默认 shell,我安装了过多的插件(哦,我的 Zsh、FZF 等),所以我认为其中一个插件可能在升级期间/之后出现了问题,所以我切换到 Bash:同样的事情,自动完成需要 10-30 秒(取决于目录大小)才能出现。我又安装了一些 shell 来解决问题,令我惊讶的是,tcsh
工作fish
完全正常。在相同的设置下,这两个执行得非常好,Bash 和 Zsh 会挂起 10 秒。
我已经用 Bash 完成了通常的诊断,与我的 Zsh 安装相比,Bash 的配置非常普通:strace
、set -x
等,但找不到太多有趣的东西。还排除了 FZF 的问题,因为卸载后仍然缓慢...我的直觉仍然告诉我这一定是完成引擎的某种奇怪的散列/缓存问题,以某种方式影响了 Zsh 和 Bash,但我不知道确实有任何证据支持这一点。使用较小的文件夹(几个文件,几个子目录)进行自动补全在我尝试过的所有 shell 中都可以正常工作。我尝试过的其他事情是运行fsck -A -y
以确保我没有任何损坏的分区并重新安装bash-completion
,zsh
以防某些元数据或缓存损坏。
我认为这里真正有趣的是这样一个事实,tcsh
即fish
自动完成我扔给他们的任何东西都没有问题,但 Bash 和 Zsh 却没有。有人知道这是怎么回事吗?非常感谢任何对此事有所了解的人!
答案1
问题解决了!我正在摆弄perf trace
,当一行一行的输出滚动过去时,我瞥见了一些从 Konsole(我的默认终端)对 libnotify 的奇怪调用。这看起来很奇怪,因为在重新格式化之后,我不再安装任何桌面通知守护程序(我使用 i3,它没有附带通知守护程序,你看)。这让我想到尝试不同的终端模拟器。所以我尝试了urxvt
一下,结果发现问题消失了。我也尝试过gnome-terminal
,完全没有问题!难道 Konsole 试图通过 dbus/systemd 发出桌面通知,但由于没有安装 libnotify 守护进程来响应请求而超时?所以我安装了dunst
,这是我在升级之前使用的守护进程,正如我怀疑的那样,Konsole 中的自动完成缓慢已经消失了!
因此,我不知道调用自动完成功能时 Konsole 会尝试做什么,因为我从未看到弹出任何通知,即使在安装守护程序后也没有,但无论如何,问题现在似乎已得到解决。
我想我会把这个带到 KDE 团队,看看他们的想法是什么,因为尽管这是我没有安装通知守护进程的错,但我尝试的其他终端都很好地处理了这个问题。
不管怎样,谢谢大家的帮助!