Trong tất cả các shell, các khối được sắp xếp theo mặc định. Họ đã được người /etc/glob
trợ giúp được gọi bởi vỏ của Ken Thompson để mở rộng các khối trong phiên bản đầu tiên của Unix vào đầu những năm 70 (và đã mang lại cho họ những cái tên ảm đạm).
Đối với sh
, POSIX không yêu cầu chúng được sắp xếp theo cách strcoll()
, đó là sử dụng thứ tự sắp xếp trong ngôn ngữ của người dùng, giống như ls
mặc dù một số người vẫn thực hiện thông qua strcmp()
, chỉ dựa trên các giá trị 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
Bạn có thể nhận thấy ở trên rằng đối với các shell đó sắp xếp dựa trên miền địa phương, ở đây trên hệ thống GNU có en_GB.UTF-8
miền địa phương, -
tên tệp trong tệp sẽ bị bỏ qua để sắp xếp (hầu hết các ký tự dấu chấm câu). Việc ó
này được sắp xếp theo cách được mong đợi hơn (ít nhất là đối với người Anh) và trường hợp bị bỏ qua (trừ khi quyết định quan hệ).
Tuy nhiên, bạn sẽ nhận thấy một số điểm không nhất quán cho log log②. Đó là bởi vì thứ tự sắp xếp của và không được xác định trong các ngôn ngữ GNU (hiện tại; hy vọng nó sẽ được sửa vào một ngày nào đó). Họ sắp xếp giống nhau, vì vậy bạn nhận được kết quả ngẫu nhiên.
Thay đổi ngôn ngữ sẽ ảnh hưởng đến thứ tự sắp xếp. Bạn có thể đặt miền địa phương thành C để có được một strcmp()
loại giống như:
$ 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
Lưu ý rằng một số địa phương có thể gây ra một số nhầm lẫn ngay cả đối với các chuỗi all-ASCII all-alnum. Giống như những người Séc (ít nhất là trên các hệ thống GNU), nơi ch
là một yếu tố đối chiếu sắp xếp sau h
:
$ LC_ALL=cs_CZ.UTF-8 bash -c 'echo *'
log0Ah log0Bh log0Dh log0Ch
Hoặc, như được chỉ ra bởi @ninjalj, thậm chí những người lạ hơn ở các địa phương Hungary:
$ LC_ALL=hu_HU.UTF-8 bash -c 'echo *'
logX LOGx LOGX logZ LOGz LOGZ logY LOGY LOGy
Trong zsh
, bạn có thể chọn sắp xếp với vòng loại toàn cầu . Ví dụ:
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.
Loại số echo *(n)
cũng có thể được kích hoạt trên toàn cầu với numericglobsort
tùy chọn:
$ 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
Nếu bạn (như tôi) bị nhầm lẫn bởi thứ tự đó trong trường hợp cụ thể đó (ở đây sử dụng ngôn ngữ Anh của tôi), xem tại đây để biết chi tiết.
sort
giống như đối với trình bao khi nó mở rộng một mẫu hình cầu tên.