In tutte le shell, i globs sono ordinati per impostazione predefinita. Erano già /etc/globdall'aiutante chiamato dalla shell di Ken Thompson per espandere i globs nella prima versione di Unix nei primi anni '70 (e che ha dato loro il nome).
Perché shPOSIX richiede che vengano ordinati per mezzo di questo strcoll(), cioè utilizzando l'ordinamento nella locale dell'utente, come lsse alcuni lo fanno ancora tramite strcmp(), basato solo su valori byte.
$ 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
Si può notare in precedenza che per quelle shell che eseguono l'ordinamento in base alla locale, qui su un sistema GNU con una en_GB.UTF-8locale, i -nomi dei file nei file vengono ignorati per l'ordinamento (la maggior parte dei caratteri di punteggiatura). Il óè ordinato in modo più atteso (almeno per gli inglesi), ed il caso viene ignorato (tranne quando si tratta di decidere legami).
Tuttavia, noterai alcune incongruenze per log① log②. Questo perché l'ordinamento di ① e ② non è definito nelle localizzazioni GNU (attualmente; si spera che verrà risolto un giorno). Ordinano lo stesso, in modo da ottenere risultati casuali.
La modifica delle impostazioni internazionali influirà sull'ordinamento. È possibile impostare le impostazioni internazionali su C per ottenere un strcmp()ordinamento simile:
$ 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
Si noti che alcune impostazioni locali possono causare confusioni anche per le stringhe all-alnum all-ASCII. Come quelli cechi (almeno sui sistemi GNU) in cui chè presente un elemento di confronto che ordina h:
$ LC_ALL=cs_CZ.UTF-8 bash -c 'echo *'
log0Ah log0Bh log0Dh log0Ch
Oppure, come sottolineato da @ninjalj, anche quelli più strani nelle località ungheresi:
$ LC_ALL=hu_HU.UTF-8 bash -c 'echo *'
logX LOGx LOGX logZ LOGz LOGZ logY LOGY LOGy
In zsh, puoi scegliere l'ordinamento con i qualificatori glob . Per esempio:
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.
L'ordinamento numerico di echo *(n)può anche essere abilitato a livello globale con l' numericglobsortopzione:
$ 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
Se tu (come ero) sei confuso da quell'ordine in quel particolare caso (qui usando il mio locale britannico), vedi qui per i dettagli.
sortè lo stesso di quello della shell quando si sta espandendo un modello globbing di nome file.