今天 bash 中的 Tab 补全变得很慢,令人烦恼;昨天还好好的,现在发生了一些变化,但我不确定是什么。
为了调试,我在 bash 上运行了 strace,然后输入cd /h
并点击Tab
。半秒钟后,它自动补全为cd /home
。strace
显示 bash 调用了select
,它等待了 500 毫秒才超时。这就是速度慢的原因。
Process 5639 attached
read(0, "c", 1) = 1
write(2, "c", 1) = 1
read(0, "d", 1) = 1
write(2, "d", 1) = 1
read(0, " ", 1) = 1
write(2, " ", 1) = 1
read(0, "/", 1) = 1
write(2, "/", 1) = 1
read(0, "h", 1) = 1
write(2, "h", 1) = 1
read(0, "\t", 1) = 1
select(1, [0], NULL, [0], {0, 500000}) = 0 (Timeout)
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
openat(AT_FDCWD, ".", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 3
brk(0x2a9e000) = 0x2a9e000
然后,我又从另一个用户那里进行了同样的实验,发现strace
输出几乎相同,但从select
未被调用。对于第二个用户来说,自动完成功能很快(正如预期的那样)。
Process 5738 attached
read(0, "c", 1) = 1
write(2, "c", 1) = 1
read(0, "d", 1) = 1
write(2, "d", 1) = 1
read(0, " ", 1) = 1
write(2, " ", 1) = 1
read(0, "/", 1) = 1
write(2, "/", 1) = 1
read(0, "h", 1) = 1
write(2, "h", 1) = 1
read(0, "\t", 1) = 1
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
openat(AT_FDCWD, ".", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 3
brk(0x1c9c000) = 0x1c9c000
您可以清楚地看到,调用select
在 500 毫秒后超时。我的虚拟机正在运行 bash 版本4.3.11(1)-release (x86_64-pc-linux-gnu)
,而我的本地计算机正在运行4.3.48(1)-release (x86_64-pc-linux-gnu)
如果我切换到其他用户(root 或非 root),则 tab 键完成速度很快,并且strace
显示select
从未被调用。
我该如何进一步调试?我应该升级 bash 吗?
答案1
我可以通过删除 .inputrc 来解决这个问题。不过,这次删除是意外的,我最终从头开始重写了它,所以我无法解释为什么 .inputrc 会导致这个问题。