【发布时间】:2015-01-08 20:51:46
【问题描述】:
我试图弄清楚为什么文件系统上的 bash 自动完成在我的 PC 上速度很慢。我的 Linux 机器通过 PAM 连接到 AD,我怀疑 bash 每次使用 TAB 进行自动完成时都在尝试查询网络挂载(因为它查询 PAM,所以速度很慢)。
我已经尝试过set -x,当我在/var 上进行自动完成时,最慢的操作是以下行:
[[ /var == ~* ]]
此外,当我连接到网络时,以下行在 bash 中执行需要几秒钟,而如果未连接,它会立即返回:
TEMP=~*
我想知道 bash 试图将 ~* 扩展到什么或找到解决方法。
【问题讨论】:
-
如果你想知道它是否是一个 literal 波浪号,
[[ $foo = "~"* ]]会比[[ $foo = ~* ]]快得多。即使您想保持波浪号扩展,[[ $foo = ~/* ]]也会更快,因为它只会查看它是否在 your 主目录下。 -
顺便说一下,你可以考虑设置一个
PS4,同时包含文件和行号,这样你就可以在上下文中查看错误代码。例如:PS4=':$BASH_SOURCE:$LINENO+'将为您提供每个命令运行的源文件和行。 -
getent passwd进行比较是否需要相当长的时间? -
@CharlesDuffy:它不特定于文件或目录。它在所有文件/目录上一直很慢。我需要知道是否有办法知道 bash 试图将 ~* 扩展到什么。
-
@EtanReisner:
getent passwd非常快,因为它在本地缓存。