我创建了一些文件,比如knob_A.png和knob_a.png,我在 Windows 上的队友说这会导致她的应用程序出现问题。我决定调用它knob_W.png而不是knob_a.png. 然后我对我们的共享服务器做了一个 rsync。为了清理东西,我然后做了
rm knob_[a-d]*.png
Run Code Online (Sandbox Code Playgroud)
它也删除knob_A.png了。这是错误的足球棒。
既shopt -s nocaseglob不会也不会shopt -u nocaseglob导致它按照我想要的方式行事。
我如何告诉 bash 让它的 glob 像过去一样区分大小写?
Bash 在这里区分大小写。问题在于范围内字符的排序顺序。来自 Bash 手册 ( info bash):
范围表达式中字符的排序顺序由当前语言环境和“LC_COLLATE”shell 变量(如果已设置)的值确定。
例如,在默认的 C 语言环境中,'[a-dx-z]' 等价于 '[abcdxyz]'。许多语言环境按字典顺序对字符进行排序,在这些语言环境中,'[a-dx-z]' 通常不等同于 '[abcdxyz]';例如,它可能等效于“[aBbCcDdxXyYz]”。要获得括号表达式中范围的传统解释,您可以通过将 'LC_COLLATE' 或 'LC_ALL' 环境变量设置为值 'C' 来强制使用 C 语言环境。
尝试做
export LC_COLLATE=C
Run Code Online (Sandbox Code Playgroud)