У всіх оболонках кулі впорядковані за замовчуванням. Вони вже були /etc/glob
помічником, який викликав оболонку Кена Томпсона для розширення глобусів у першій версії Unix на початку 70-х (і це дало глобусу свою назву).
Оскільки 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
Ви можете помітити вище, що для тих оболонок, які здійснюють сортування на основі локалі, тут у системі 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
Зауважте, що деякі локалі можуть спричинити певні плутанини навіть для рядків All-Alnum рядків All-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
самий, як і для оболонки, коли вона розширює шаблони назви файлів.