当我使用 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 甚至不支持多字节字符,例如dash
,mksh
或者支持但会因无效的字节序列而阻塞,例如yash
。
答案2
是的。规范的答案可以在这里找到:
如果该模式与任何现有文件名或路径名匹配,则该模式应替换为这些文件名和路径名,根据当前语言环境中有效的整理顺序排序。