ในเชลล์ทั้งหมด globs จะเรียงตามค่าเริ่มต้น พวกเขาอยู่ในความ/etc/glob
ช่วยเหลือแล้วโดยเปลือกของ Ken Thompson เพื่อขยายความมืดมนใน 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
โลแคล-
ในชื่อไฟล์จะถูกละเว้นสำหรับการเรียงลำดับ (อักขระเครื่องหมายวรรคตอนส่วนใหญ่) ó
จะถูกจัดเรียงในทางที่คาดว่าจะมากขึ้น (อย่างน้อยชาวอังกฤษ) และกรณีที่จะถูกละเว้น (ยกเว้นเมื่อมันมาถึงการตัดสินใจความสัมพันธ์)
อย่างไรก็ตามคุณจะสังเกตเห็นความไม่ลงรอยกันของบันทึกการใช้งาน นั่นเป็นเพราะลำดับการเรียงของ①และ②ไม่ได้ถูกกำหนดไว้ในที่ตั้ง 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 all-alnum ทั้งหมด เช่นเดียวกับภาษาเช็ก (ในระบบ 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
เป็นเช่นเดียวกับที่เชลล์เมื่อมันขยายรูปแบบชื่อไฟล์กลม