* 的字母扩展顺序

* 的字母扩展顺序

当我使用 POSIX 兼容的 shell(例如:dash、bash、zsh...)时,我可以确定它*总是按字母顺序扩展(由 决定LC_COLLATE)吗?

例子:

$ echo 1 > file_a
$ echo 2 > file_b
$ echo 3 > file_c
$ cat *
1
2
3

答案1

这种行为是POSIX 要求,您可以放心地信赖它。

另请注意,您希望将区域设置设置为C获得一致的行为。在区域设置中,排序规则元素具有相同的排序顺序,您将拥有奇怪的结果

在具有 UTF-8 语言环境的 GNU 系统上:

$ printf '%b\n' '\U2461' '\U2460' | sort

或者:

$ printf '%s\n' A B a b | sort
a
A
b
B

设置区域设置C

$ printf '%b\n' '\U2461' '\U2460' | LC_ALL=C sort

$ printf '%s\n' A B a b | LC_ALL=C sort
A
B
a
b

有些 shell 甚至不支持多字节字符,例如dashmksh或者支持但会因无效的字节序列而阻塞,例如yash

答案2

是的。规范的答案可以在这里找到:

如果该模式与任何现有文件名或路径名匹配,则该模式应替换为这些文件名和路径名,根据当前语言环境中有效的整理顺序排序

相关内容