Bash 中的 Tab 键竞争在“选择”处挂起

Bash 中的 Tab 键竞争在“选择”处挂起

今天 bash 中的 Tab 补全变得很慢,令人烦恼;昨天还好好的,现在发生了一些变化,但我不确定是什么。

为了调试,我在 bash 上运行了 strace,然后输入cd /h并点击Tab。半秒钟后,它自动补全为cd /homestrace显示 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 会导致这个问题。

相关内容