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

时间:2016-06-05 03:29:22

标签: bash readline tab-completion

当我想输入命令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选项卡完成可以忽略变量大小写。

1 个答案:

答案 0 :(得分:2)

存在不区分大小写的文件系统,在这样的系统上,文件名完成不区分大小写是有意义的。在一个理想的世界中,bash可以判断文件路径的一个组件是否不区分大小写,但实际上没有提供此信息的标准接口,因此bash回退到允许您显式配置不区分大小写的文件名完成:(引自{ {3}},重点补充)

  

completion-ignore-case
  如果设置为on,则readline以不区分大小写的方式执行文件名匹配和完成。默认值为“off”。

同样,您可以将glob扩展和/或案例模式配置为不区分大小写。

但是你不能使bash变量不区分大小写。 $bash$BASH是不同的变量。与bash函数名称类似,bash内置名称和bash关键字。 Bash可以完成所有这些选项卡的完成,但无论文件名区分大小写的配置如何,选项卡完成都区分大小写。

虽然这似乎是一个合理的理由,但事实证明bash tab-completion始终区分大小写除了以外的文件名(包括目录和bash命令,映射到文件名),可以配置不区分大小写。即使是通常不区分大小写的东西,如信号名称和主机名也只能以区分大小写的方式完成。