为什么 Bash 无法忽略制表符完成变量名称时的大小写?

Why Bash can't ignore case when tab completion variable names?

当我想输入命令echo $bash_,然后按Tab键,自动补全不会出现
但是当我输入命令echo $BASH_,然后我按Tab,完成列表会输出这样:

$BASH_ALIASES                $BASH_COMMAND                $BASH_SOURCE
$BASH_ARGC                   $BASH_COMPLETION_COMPAT_DIR  $BASH_SUBSHELL
$BASH_ARGV                   $BASH_LINENO                 $BASH_VERSINFO
$BASH_CMDS                   $BASH_REMATCH                $BASH_VERSION

我的 .inputrc 文件包含 readline ignorecase 选项 set completion-ignore-case on,文件名完成不区分大小写是可以的。
所以,我希望 variable name 选项卡补全可以忽略变量大小写。

存在不区分大小写的文件系统,在此类系统上,文件名完成不区分大小写是有意义的。在理想情况下,bash 可以判断文件路径的组成部分是否不区分大小写,但实际上没有提供此信息的标准接口,因此 bash 退回到让您显式配置大小写-不敏感的文件名补全:(引自 bash manual,已强调)

completion-ignore-case
  If set to on, readline performs filename matching and completion in a case-insensitive fashion. The default value is ‘off’.

同样,您可以将 glob 扩展 and/or 大小写模式配置为不区分大小写。

但是您不能使 bash 变量不区分大小写。 $bash$BASH 是不同的变量。与 bash 函数名称、bash 内置名称和 bash 关键字类似。 Bash 可以对所有这些进行制表符补全,但是无论文件名区分大小写的配置如何,制表符补全都是区分大小写的。

虽然这似乎是一个合理的理由,但事实证明 bash 制表符补全始终区分大小写 除了 文件名(包括目录和 bash 命令,映射到文件名),可以将其配置为不区分大小写。即使是通常不区分大小写的内容,如信号名称和主机名,也只能区分大小写完成。