In tutte le shell, i globs sono ordinati per impostazione predefinita. Erano già /etc/glob
dall'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é sh
POSIX richiede che vengano ordinati per mezzo di questo strcoll()
, cioè utilizzando l'ordinamento nella locale dell'utente, come ls
se 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-8
locale, 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' numericglobsort
opzione:
$ 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.