Eza: โปรแกรมทดแทน ls แบบสมัยใหม่และยังมีการดูแลต่อเนื่อง
(github.com/eza-community)- eza เป็นเครื่องมือ CLI สมัยใหม่ที่ใช้แทนคำสั่งแสดงรายการไฟล์
lsบน Unix/Linux โดยมีเป้าหมายเพื่อให้ฟีเจอร์มากขึ้นและค่าเริ่มต้นที่ดีกว่า - แยกประเภทไฟล์และเมทาดาทาด้วย สี รู้จัก symbolic link, extended attributes และข้อมูล Git และมาในรูปแบบ ไบนารีเดี่ยว ที่เล็กและเร็ว
- เมื่อเทียบกับ
exaเดิม เพิ่มการแก้ Grid Bug, ไฮเปอร์ลิงก์, รายละเอียด mount point, SELinux context, สถานะ Git repository, วันที่สัมพัทธ์ที่อ่านง่าย, การแก้ด้านความปลอดภัย, สีเทอร์มินัลแบบbrightและการตั้งค่าtheme.yml - ติดตั้งได้บน Windows, macOS และ Linux และในสภาพแวดล้อม Nix flake สามารถ build แล้วรันได้ด้วย
nix run github:eza-community/eza - มีระบบตัวเลือกที่ไม่เหมือน
lsทั้งหมด และสามารถปรับแต่งรูปแบบเอาต์พุตรายการไฟล์ได้ละเอียดผ่านการแสดงผล การกรอง รายการแบบยาว และการตั้งค่าธีม
ประสบการณ์ทดแทน ls ที่ eza มอบให้
- eza เป็นทางเลือกสมัยใหม่แทนคำสั่งแสดงรายการไฟล์เก่า
lsที่รวมอยู่ในระบบปฏิบัติการ Unix และ Linux - เป้าหมายหลักคือการให้เวอร์ชันที่ มีฟีเจอร์มากกว่าและเป็นมิตรกับผู้ใช้มากกว่า
ls - แยกประเภทไฟล์และเมทาดาทาด้วยสี
- รู้จัก symbolic link, extended attributes และข้อมูล Git
- เล็ก เร็ว และมาในรูปแบบ ไบนารีเดี่ยว
ฟีเจอร์ที่เพิ่มจาก exa
- eza มีฟีเจอร์จำนวนมากที่
exaไม่มี- แก้ “The Grid Bug” ที่ถูกนำเข้ามาใน
exaปี 2021 - รองรับ ไฮเปอร์ลิงก์
- แสดงรายละเอียด mount point
- แสดง SELinux context
- แสดงสถานะ Git repository
- วันที่สัมพัทธ์ที่อ่านง่าย
- การแก้ไขด้านความปลอดภัยหลายรายการ
- รองรับสีเทอร์มินัลแบบ
bright - การแก้บั๊กและการเปลี่ยนแปลงย่อยอื่น ๆ
- ไฟล์ตั้งค่า
theme.ymlสำหรับปรับแต่งสีและไอคอน
- แก้ “The Grid Bug” ที่ถูกนำเข้ามาใน
การรันและการติดตั้ง
- ในสภาพแวดล้อมที่รองรับ Nix flake สามารถทดลองใช้ eza ได้ด้วยคำสั่งต่อไปนี้
nix run github:eza-community/eza
- Nix จะ build eza แล้วรัน
- หากต้องการส่งอาร์กิวเมนต์ ให้ใส่ตัวเลือกหลัง
--เช่นนี้nix run github:eza-community/eza -- -ol
- eza ใช้งานได้บน Windows, macOS, Linux
- วิธีติดตั้งตามแพลตฟอร์มและดิสโทรอยู่ใน INSTALL.md
โครงสร้างตัวเลือกบรรทัดคำสั่ง
- ตัวเลือกของ eza แทบเหมือน
lsแต่ไม่เหมือนทั้งหมด -
ตัวเลือกการแสดงผล
-1,--oneline: แสดงหนึ่งรายการต่อหนึ่งบรรทัด-G,--grid: แสดงรายการเป็นกริด และเป็นค่าเริ่มต้น-l,--long: แสดงรายละเอียดและคุณสมบัติเพิ่มเติม-R,--recurse: สำรวจไดเรกทอรีแบบ recursive-T,--tree: แสดงไดเรกทอรีแบบ recursive ในรูปต้นไม้-F,--classify=(when): แสดงตัวบ่งชี้ประเภทข้างชื่อไฟล์--colour=(when),--color=(when): กำหนดช่วงเวลาที่จะใช้สีเทอร์มินัล--icons=(when): กำหนดช่วงเวลาที่จะแสดงไอคอน--hyperlink=(when): กำหนดช่วงเวลาที่จะแสดงรายการเป็นไฮเปอร์ลิงก์--absolute=(mode): กำหนดวิธีแสดงพาธแบบ absolute ของรายการ
-
ตัวเลือกการกรอง
-a,--all: แสดงไฟล์ซ่อนและ dot files-d,--treat-dirs-as-files: แสดงไดเรกทอรีเหมือนไฟล์ทั่วไป-L,--level=(depth): จำกัดความลึกของ recursion-s,--sort=(field): กำหนดฟิลด์สำหรับเรียงลำดับ--group-directories-first: แสดงไดเรกทอรีก่อน--group-directories-last: แสดงไดเรกทอรีทีหลัง-D,--only-dirs: แสดงเฉพาะไดเรกทอรี-f,--only-files: แสดงเฉพาะไฟล์--git-ignore: ไม่สนใจไฟล์ที่อยู่ใน.gitignore-I,--ignore-glob=(globs): ไม่สนใจไฟล์ที่ตรงกับแพตเทิร์น glob หลายรายการคั่นด้วย pipe- หากส่ง
--allสองครั้ง จะแสดงไดเรกทอรี.และ..ด้วย
รายการแบบยาวและข้อมูลเกี่ยวกับ Git
- เมื่อใช้
--longหรือ-lจะสามารถใช้ตัวเลือกรายการแบบยาวได้ - มีตัวเลือกเกี่ยวกับขนาดไฟล์และสิทธิ์
-b,--binary: แสดงขนาดไฟล์ด้วย binary prefix-B,--bytes: แสดงขนาดไฟล์เป็นไบต์โดยไม่มี prefix-o,--octal-permissions: แสดงสิทธิ์ในรูปแบบเลขฐานแปด--no-permissions,--no-filesize,--no-user,--no-time: ระงับการแสดงผลแต่ละฟิลด์
- มีตัวเลือกเกี่ยวกับระบบไฟล์และเมทาดาทา
-H,--links: แสดงจำนวน hard links-i,--inode: แสดงหมายเลข inode-M,--mounts: แสดงรายละเอียด mount ใช้งานได้เฉพาะบน Linux และ macOS-Z,--context: แสดง security context-@,--extended: แสดง extended attributes และขนาด--total-size: แสดงขนาดไดเรกทอรีแบบ recursive
- รองรับเอาต์พุตเกี่ยวกับ Git ด้วย
--git: แสดงสถานะ Git ของแต่ละไฟล์ที่ถูกติดตามหรือถูกละเว้น--git-repos: แสดงสถานะ Git ของแต่ละไดเรกทอรีที่ถูกติดตาม--git-repos-no-status: แสดงเฉพาะว่าไดเรกทอรีเป็น Git repository หรือไม่ และเร็วกว่า--no-git: ไม่สนใจ--git,--git-repos,--git-repos-no-statusเสมอ และระงับการแสดงสถานะ Git
- รูปแบบเวลารองรับ
default,iso,long-iso,full-iso,relativeหรือรูปแบบกำหนดเองในรูป+<FORMAT>- ตัวอย่าง:
+%Y-%m-%d %H:%Mจะแสดงผลในรูปแบบ2023-09-30 13:00 - ดูสตริงรูปแบบโดยละเอียดได้ที่หน้า manual
eza(1)และ chrono documentation
- ตัวอย่าง:
- ดูหน้า manual ได้ใน ไดเรกทอรี man ของ repository และตั้งแต่เวอร์ชัน
[0.18.13] - 2024-04-25เป็นต้นไป สามารถใช้man ezaในเทอร์มินัลได้ด้วย
การปรับแต่งธีม
- eza เพิ่งเพิ่มการรองรับไฟล์
theme.yml - ใน
theme.ymlสามารถกำหนดตัวเลือกธีมเดิมที่เคยใช้ได้ผ่านตัวแปรสภาพแวดล้อมLS_COLORSและEXA_COLORS - มีตัวเลือกสำหรับกำหนด ไอคอนที่แตกต่างกัน ตามประเภทไฟล์และนามสกุลไฟล์ด้วย
- หากตั้งค่าตัวแปรสภาพแวดล้อมเดิมไว้ จะยังทำงานต่อไปเพื่อความเข้ากันได้ย้อนหลัง และจะมีลำดับความสำคัญสูงกว่า
- ดูธีมสำเร็จรูปหรือร่วมมีส่วนร่วมได้ที่ repository ทางการ eza-themes
- ไฟล์ธีมตัวอย่างอยู่ที่
docs/theme.yml - ไฟล์ธีมสามารถวางไว้ในไดเรกทอรีที่กำหนดด้วยตัวแปรสภาพแวดล้อม
EZA_CONFIG_DIRหรือโดยค่าเริ่มต้นจะค้นหาที่$XDG_CONFIG_HOME/eza - รายละเอียดเพิ่มเติมอยู่ใน eza_colors-explanation.5.md และ docs/theme.yml
การมีส่วนร่วม
- หากต้องการมีส่วนร่วมกับ eza ต้องปฏิบัติตาม code of conduct
- ข้อมูลสำหรับการเข้าร่วมพัฒนาจริงอยู่ใน CONTRIBUTING.md
1 ความคิดเห็น
ความคิดเห็นบน Hacker News
ในรายการไดเรกทอรี วันที่แบบอ่านง่ายสำหรับมนุษย์ น่ารำคาญเป็นพิเศษ
ถ้าผมกำลังหาของที่คัดลอกเข้าโฟลเดอร์เมื่อวานราว 11 โมงเช้า แต่ทุกอย่างแสดงว่า “1 day ago” มันไม่ช่วยเลย ต้องมีวันที่และเวลา และฟอรัมอย่าง HN ก็ควรทำแบบเดียวกัน คือแสดงวันที่/เวลาที่แน่นอนก่อน แล้วถ้าจำเป็นค่อยใส่ “7 hours ago” ต่อท้ายก็ได้
ไม่เข้าใจว่าทำไมถึงจงใจตัดข้อมูลออก และสงสัยว่านี่เป็นผลจากแนวทางแบบ infinite scroll หรือเปล่า
เวลาเขียน HTML ผมพยายามใช้เสมอ
(https://developer.mozilla.org/en-US/docs/Web/HTML/Element/ti...)
ต่อให้จำได้ว่าวันที่ต้องการคือวันถัดจากวันเกิดเพื่อน และพยายามหารายการบางอย่าง ถ้าหน้าจอแสดงแค่ “three months ago” ก็ต้องไล่ค้นข้อมูลทั้งเดือน
แค่ให้เวลาละเอียดก่อน แล้วถ้าต้องการก็ค่อยแสดง “กี่วันก่อน” ควบคู่ไปก็พอ
แม้จะมี
lsdแต่ก็ยังชอบ eza มากกว่าสำหรับคนที่สนใจ ตอนนี้มีเครื่องมือบรรทัดคำสั่งสมัยใหม่ที่ใช้แทนเครื่องมือเดิม ๆ อยู่หลายตัว:
batคือcatที่มีการไฮไลต์ไวยากรณ์,difftasticคือdiffที่ดีกว่า,gduคือncduสำหรับ SSD,zoxideคือcdสมัยใหม่,fdเป็นทางเลือกแทนfind,rgคือripgrep,fzfเป็นเครื่องมือค้นหาแบบ fuzzy,jlessเป็นตัวดู JSON ที่พับด้วยเมาส์ได้,draใช้ดาวน์โหลด/ติดตั้ง release assets,lazygitเป็น Git TUI,lazydockerเป็น Docker TUI,yaziเป็นตัวจัดการไฟล์ที่พรีวิวรูปภาพได้,zellijคือtmux/screenที่ดีกว่า,starshipเป็นเครื่องมือตั้งค่า prompt ที่ใช้ได้กับหลายเชลล์taskเป็นทางเลือกแทน Makefile,hyperfineเป็น เครื่องมือ benchmark,vegetaเป็นเครื่องมือทดสอบโหลด,sdคือsedที่ดีกว่าและเข้าใจง่ายกว่ายังมีสามสหาย JSON ด้วย:
jqเป็นตัวประมวลผล JSON ที่รู้จักกันดี,jcแปลงเอาต์พุตจากเครื่องมือ CLI หลายตัวเป็น JSON,gronทำให้grepJSON ได้ง่ายขึ้นfdและrgจะ ละเว้น รายการที่อยู่ใน.gitignoreเป็นค่าเริ่มต้น ถ้าคิดว่าเป็นตัวแทนfindแบบตรงไปตรงมาอาจแปลกใจได้ มีการถกเรื่องนี้อยู่ที่ [0]เวลาจะแนะนำเครื่องมือพวกนี้ควรบอกจุดนี้ให้ชัด ถ้าไม่อ่านเอกสารก็พลาดได้ง่าย โดยส่วนตัวอยากให้เครื่องมือแนว coreutils ทดแทนเหล่านี้คงค่าเริ่มต้นให้ใกล้เคียงกับเครื่องมือต้นฉบับมากกว่านี้ ถ้าโปรโมตว่าเป็น “ทางเลือกแทน find ที่เรียบง่าย รวดเร็ว และเป็นมิตรต่อผู้ใช้” ก็ควรเคารพค่าเริ่มต้นของต้นฉบับเพื่อลดความประหลาดใจของผู้ใช้ใหม่ alias มีอยู่แล้ว ดังนั้นการใส่
alias fd='fd --ignore'ไว้ใน~/.${SHELL##*/}rcน่าจะดีกว่าalias fd='fd --no-ignore'เป็นทิป ถ้าอยากใช้เวอร์ชันที่ไม่ผ่าน alias ให้ใช้
\commandได้ เช่น ผมใช้alias grep='grep --color=always --no-messages --binary-files=without-matchอยู่ แต่ตัวเลือกสีอาจเปลี่ยนการแทนอักขระ ทำให้เกิดข้อผิดพลาดเมื่อ pipe ไปยังcurlไม่ได้เกิดกับทุก pipe แต่ถ้าเจอครั้งแรกก็ค่อนข้างงง ตรวจสอบได้ด้วยecho "Hello world" | \grep --color=always "Hello" | hexdumpแล้วตามด้วย!!:s^always^never[0] https://github.com/sharkdp/fd/issues/612
https://github.com/ibraheemdev/modern-unix
zellijดีกว่าscreenแท็บ/หมายเลขหน้าจอไม่ได้ถูกกำหนดอย่างถูกต้อง ทำให้ถ้าจะสลับไปทันทีต้องนับเอง ซึ่งรับยากGNU ls ยังมีการบำรุงรักษาอยู่ มีคอมมิตที่กระทบไฟล์
ls.cทั้งวันที่ 2024-06-24 และ 2024-06-27 ซึ่งยังไม่ถึงเดือนด้วยซ้ำเมลลิงลิสต์ของ GNU Coreutils ก็ค่อนข้างคึกคัก ดูเหมือนโปรเจกต์นี้ใช้คำว่า “maintained” ในความหมายว่า “มีการพัฒนาอย่างแข็งขัน”
ezafork มาexaไม่ได้รับการบำรุงรักษาประมาณ 1 ปี จนกระทั่งคนเพียงคนเดียวที่มีสิทธิ์เขียนใน repository ทำเครื่องหมาย deprecated อย่างเป็นทางการตอนนี้ก็ผ่านมานานพอสมควรแล้วหลังจาก fork จึงไม่ใช่ทุกคนที่จะรู้จัก
exaและเจตนาของถ้อยคำนี้ก็ยิ่งไม่ชัดเจนมากขึ้น ดูเหมือนถึงเวลาปรับข้อความแล้ว เพราะมีปฏิกิริยาแบบนี้อยู่lsไม่ได้รับการบำรุงรักษา แต่หมายถึงเป็น ทางเลือกทดแทน ที่ได้รับการบำรุงรักษา ในฐานะ fork ของexaซึ่งเป็นตัวทดแทนlsที่ไม่ได้รับการบำรุงรักษาแล้วหลังเปลี่ยนมาใช้เชลล์ fish ปริมาณการใช้
lsลดลง 100% คำสั่งในตัว Alt + l แสดงเนื้อหาในไดเรกทอรีได้ จึงมีประโยชน์มาก และทำให้ประวัติของเชลล์สะอาดขึ้นด้วยlsลงในตัวแปรสภาพแวดล้อมHISTIGNOREเพื่อรักษา ประวัติ ให้สะอาดขึ้นได้: https://superuser.com/questions/232885/can-you-share-wisdom-...lsส่วนใหญ่หายไปใน fish คือการตั้งค่าให้รันlsอัตโนมัติเมื่อเปลี่ยนไดเรกทอรีfunction ls_on_cd --on-variable PWDlsend__bash_ctrl_n()แล้วให้เครื่องมือต่าง ๆ ใน dotfiles เขียนทับฟังก์ชันเหล่านี้ได้ เช่น ถ้าติดตั้ง Git ไว้ ก็จะตั้งให้__bash_ctrl_e()รันgit statusและgit logezaเพราะผมตั้ง alias ให้lsเป็นezaไว้ สุดท้ายก็เหมือนรันlsเฉย ๆlsส่วนใหญ่เกิดขึ้นทันทีหลังcdเลยเพิ่มลงในไฟล์เริ่มต้น ตอนนี้แทบทุกครั้งที่cdจะรันlsอัตโนมัติใน Bash เรียก
builtin cd "$@" && ls -lในฟังก์ชันcd()ส่วนใน fish เรียกbuiltin cd $argvแล้วถ้าไม่มีข้อผิดพลาดและไม่ใช่การย้ายไปโฮม ก็ให้รันdirโดยรวมแล้วไม่สะดวกกับเครื่องมือเทอร์มินัลที่บังคับใช้สีเพื่อแยกชนิดหรือคุณสมบัติของไฟล์ ดิสโทรต่าง ๆ ก็มักตั้งค่า
lsมาแบบนั้น แต่ผมจะลบการตั้งค่านั้นแล้วใช้ค่าเริ่มต้นผมใช้พื้นหลังเทอร์มินัลที่สบายตา แต่ color scheme แบบนี้มักชนกับพื้นหลังเสมอ หรือมีสีที่อ่านยากอยู่ด้วย เอาต์พุตของ
lsหรือโปรแกรมทดแทนไม่จำเป็นต้องมีสี แค่ระดับที่ls -AFCให้มาก็พอแล้ว[0] https://github.com/chriskempson/base16
[1] https://tinted-theming.github.io/base16-gallery/
ถึงอย่างนั้นก็ควรมีทางแก้ โดยตั้งค่าใด ๆ ให้
$NO_COLORก็พอ https://no-color.orgการส่ง bug report ให้เครื่องมือที่ไม่ตรวจและไม่เคารพตัวแปรสภาพแวดล้อมนี้ถือว่าสมเหตุสมผลมาก
vivid[1] เพื่อเลือกธีมที่เข้ากับพื้นหลังเทอร์มินัล แล้วโหลดตัวแปร LS_COLORS ที่สร้างขึ้นเข้าเชลล์ก็ได้[1]: https://github.com/sharkdp/vivid/
แปลกที่ README ไม่ได้เขียนว่า
ezaเป็น ฟอร์กของexaสงสัยว่าทำไมเวอร์ชันใหม่ ๆ ของยูทิลิตี GNU ถึงถูกทำออกมาภายใต้ ไลเซนส์ MIT เยอะขนาดนี้ ดูเหมือนจะมีค่อนข้างมาก
lsขึ้นมา GNU coreutils ซึ่งรวมlsด้วย เดิมทีก็เป็นเวอร์ชันใหม่ของยูทิลิตี AT&T แบบ proprietary หรือยูทิลิตีที่ใช้ไลเซนส์ BSDทำไมโปรแกรมทดแทน
lsถึงต้องใช้ Kerberos กับ SSH?ดู
ldd /usr/bin/ezaแล้วพบว่าลิงก์กับไลบรารีค่อนข้างเยอะ เช่นlibgit2,libgssapi_krb5,libmbedtls,libssh2,libkrb5,libcrypto,libzstdเป็นต้นlsแล้ว dependency เยอะเกินไปจริง ๆบนคีย์บอร์ด QWERTY การพิมพ์
ezaเป็นชุดสามตัวอักษรที่ค่อนข้างแย่มาก ข้อดีอย่างหนึ่งของlsคือเป็นชุดปุ่มที่พิมพ์ได้เร็วมากจะสร้าง alias ก็ได้ แต่ด้วยเหตุผลอย่างความเข้ากันได้ มันรู้สึกแปลก ๆ
ezaและก่อนหน้านั้นexaเป็นls,ll,lllมาโดยตลอด และไม่เคยเจอ ปัญหาความเข้ากันได้ เลยผมติดตั้ง
slไว้ด้วย เพื่อฝึกตัวเองไม่ให้พิมพ์ผิดezaดูเหมือนจะเป็นการปรับปรุง เพราะบน Dvoraklsเทียบกับ QWERTY คือp-ซึ่งทั้งคู่เป็นปุ่มนิ้วก้อยขวายังไงก็เถอะ ใครใช้
lsกัน? ก็แค่กด Tab เติมคำอัตโนมัติไปเรื่อย ๆ จนกว่าไฟล์ที่ต้องการจะโผล่มาล้อเล่นน่ะ แต่ก็สงสัยว่าทำไมถึงอ้างว่า
lsไม่ได้รับการดูแลอีกต่อไปแล้วls[0]https://github.com/ogham/exa
lsยังคงได้รับการดูแลในฐานะส่วนหนึ่งของเชลล์หรือ coreutilsแต่
ezaเป็นตัวแยกสายของexaและเท่าที่ผมรู้exaไม่ได้รับการดูแลต่อแล้ว