在所有shell中,默认情况下对glob进行排序。肯·汤普森(Ken Thompson)的外壳呼唤的/etc/glob
助手已经在70年代初的Unix的第一个版本中扩展了glob(并为glob命名)。
对于sh
,POSIX确实要求使用来对它们进行排序strcoll()
,即使用用户语言环境中的排序顺序,就像ls
有些人仍然通过strcmp()
,仅基于字节值。
$ dash -c 'echo *'
Log01B log-0D log00 log01 log02 log0A log0B log0C log4E log4F log50 log① log② lóg01
$ bash -c 'echo *'
log① log② log00 log01 lóg01 Log01B log02 log0A log0B log0C log-0D log4E log4F log50
$ zsh -c 'echo *'
log① log② log00 log01 lóg01 Log01B log02 log0A log0B log0C log-0D log4E log4F log50
$ ls
log② log① log00 log01 lóg01 Log01B log02 log0A log0B log0C log-0D log4E log4F log50
$ ls | sort
log②
log①
log00
log01
lóg01
Log01B
log02
log0A
log0B
log0C
log-0D
log4E
log4F
log50
您可能会在上面注意到,对于那些基于语言环境进行排序的shell,在具有语言环境的GNU系统上en_GB.UTF-8
,-
文件名中的会被忽略以进行排序(大多数标点符号会这样做)。该ó
以更期望的方式(至少英国人)排序,并忽略大小写(当谈到决定关系除外)。
但是,您会注意到log①log②的某些不一致之处。这是因为①和②的排序顺序未在GNU语言环境中定义(当前;希望有一天会固定)。它们的排序相同,因此您将获得随机结果。
更改语言环境将影响排序顺序。您可以将语言环境设置为C以获得类似strcmp()
的排序:
$ bash -c 'echo *'
log① log② log00 log01 lóg01 Log01B log02 log0.2 log0A log0B log0C log-0D log4E log4F log50
$ bash -c 'LC_ALL=C; echo *'
Log01B log-0D log0.2 log00 log01 log02 log0A log0B log0C log4E log4F log50 log① log② lóg01
请注意,即使对于全ASCII全数字字符串,某些语言环境也会引起一些混乱。与捷克语(至少在GNU系统上)ch
类似,其中的归类元素排在后面h
:
$ LC_ALL=cs_CZ.UTF-8 bash -c 'echo *'
log0Ah log0Bh log0Dh log0Ch
或者,正如@ninjalj所指出的,甚至在匈牙利语言环境中也很奇怪:
$ LC_ALL=hu_HU.UTF-8 bash -c 'echo *'
logX LOGx LOGX logZ LOGz LOGZ logY LOGY LOGy
在中zsh
,您可以选择使用glob限定词进行排序。例如:
echo *(om) # to sort by modification time
echo *(oL) # to sort by size
echo *(On) # for a *reverse* sort by name
echo *(o+myfunction) # sort using a user-defined function
echo *(N) # to NOT sort
echo *(n) # sort by name, but numerically, and so on.
echo *(n)
也可以使用以下numericglobsort
选项全局启用数字排序:
$ zsh -c 'echo *'
log① log② log00 log01 lóg01 Log01B log02 log0.2 log0A log0B log0C log-0D log4E log4F log50
$ zsh -o numericglobsort -c 'echo *'
log① log② log00 lóg01 Log01B log0.2 log0A log0B log0C log01 log02 log-0D log4E log4F log50
如果您(像我一样)在特定情况下(在此使用我的英国语言环境)对该命令感到困惑,请参阅此处以获取详细信息。
sort
与Shell扩展文件名globbing模式时的排序顺序相同。