【问题标题】:How to debug bash expansion?如何调试 bash 扩展?
【发布时间】: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 非常快,因为它在本地缓存。

标签: linux bash


【解决方案1】:

尝试使用 strace 运行它 例如 strace 回声 $FOO 如果系统正在访问你的挂载,你就会知道

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-05
    • 2012-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多