我用Windows 上的 Git Bash用于超出 Git 使用范围的众多 bash 任务。多年来它运行良好,但我无法改变不区分大小写的行为。这种方式自动完成很麻烦。
我尝试了旗帜
shopt -u nocasematch
在.bashrc
所描述的在解决方案#3中但这并不能解决问题。
解决方案 #1 或 #2 都不是我正在寻找的选项,因为我有大写的别名、混合大小写的目录和一些全小写的文件,并且应用案例映射的情况太多。
有没有办法在我的非默认 Linux shell 中启用区分大小写的自动完成功能?
由于它的口味不同,我希望得到一些提示或建议。
答案1
您需要恢复两个设置,nocaseglob
并且nocasematch
:
文档 ( man bash
) 写道,
nocaseglob
如果设置,则bash
在执行路径名扩展时以不区分大小写的方式匹配文件名 [...]
nocasematch
如果设置,则在执行或条件命令时执行匹配、执行模式替换字扩展或过滤可能的完成作为可编程完成的一部分时,bash
以不区分大小写的方式匹配模式。case
[[
对于我的 Cygwin 环境,这些都已设置off
(尽管可以说两者都应该on
用于以 Windows 为中心的 NTFS 文件系统的使用,该系统需要可记住大小写但不区分大小写*):
shopt | grep case
nocaseglob off
nocasematch off
如果在您的环境中设置了这些on
并且您希望禁用它们(以便区分大小写进行比较),您可能需要尝试此命令
shopt -u nocasematch nocaseglob
但我应该指出,这可能行不通。安装在基于 Linux 的操作系统上的 NTFS 文件系统区分大小写(我可以创建和访问Abc
、aBC
、 和abc
作为单独的文件)。 Windows 系统上的同一文件系统被视为不区分大小写,并且只能从文件资源管理器或 Cygwin 访问这三个文件中的一个(尝试打开这三个文件中的任何一个仅返回“第一个”文件)。我怀疑这种详细程度超出了您的要求,但我只是添加它以防万一有用。
附加信息来自 Cygwin,其中我没有测试过因为它似乎强制执行与您想要的相反的配置:
区分大小写的文件名 在 Win32 子系统中,文件名仅保留大小写,但不区分大小写。您无法访问同一目录中仅大小写不同的两个文件,例如 Abc 和 aBc。虽然 NTFS(和一些远程文件系统)支持区分大小写,但 NT 内核默认情况下不支持它。相反,您必须调整注册表设置并重新启动。因此,Cygwin 不支持区分大小写,除非您更改该注册表值。
HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\kernel\obcaseinsensitive
如果您确实希望 Cygwin 区分大小写,可以通过将注册表值设置为 0 并重新启动计算机来打开它。
作为一个不同的角度,西格文基于区分大小写的自动完成。如果我有一个目录Downloads
和一个目录dances
,那么ls -d D
Tab只提供一个目录,我认为这是您想要的行为。如果您不是绝对热衷于 Git bash,您可能想尝试使用 Cygwin 及其git
软件包。
* NTFS 本身区分大小写。然而,当在 Windows 环境中使用时,它似乎可以记住大小写,但不区分大小写,所以这就是我们必须处理的问题。