3 điểm bởi GN⁺ 2024-07-23 | 1 bình luận | Chia sẻ qua WhatsApp
  • eza là một công cụ CLI hiện đại thay thế lệnh liệt kê tệp ls trên Unix/Linux, hướng đến việc cung cấp nhiều tính năng hơn và mặc định tốt hơn
  • Công cụ này phân biệt màu sắc theo loại tệp và metadata, nhận diện liên kết tượng trưng, thuộc tính mở rộng và thông tin Git, đồng thời được cung cấp dưới dạng một binary duy nhất nhỏ gọn và nhanh
  • So với exa, nó bổ sung bản sửa lỗi Grid Bug, hyperlink, thông tin chi tiết mount point, ngữ cảnh SELinux, trạng thái kho Git, ngày tương đối dễ đọc với con người, bản vá bảo mật, màu terminal bright, và cấu hình theme.yml
  • Có thể cài đặt trên Windows, macOS và Linux; trong môi trường Nix flake, có thể build rồi chạy bằng nix run github:eza-community/eza
  • Hệ thống tùy chọn của nó không hoàn toàn giống ls, và có thể tinh chỉnh chi tiết cách hiển thị danh sách tệp thông qua các tùy chọn hiển thị, lọc, danh sách dài và cấu hình theme

Trải nghiệm thay thế ls mà eza mang lại

  • eza là một lựa chọn thay thế hiện đại cho lệnh liệt kê tệp lâu đời ls đi kèm với các hệ điều hành Unix và Linux
  • Mục tiêu cơ bản là cung cấp một phiên bản nhiều tính năng hơn và thân thiện với người dùng hơn so với ls
  • Phân biệt màu theo loại tệp và metadata
  • Nhận diện symbolic link, thuộc tính mở rộng và thông tin Git
  • Nhỏ gọn, nhanh và được cung cấp dưới dạng một binary duy nhất

Các tính năng bổ sung so với exa

  • eza bao gồm nhiều tính năng mà exa không có
    • Sửa “The Grid Bug” được đưa vào từ exa 2021
    • Hỗ trợ hyperlink
    • Xuất thông tin chi tiết mount point
    • Xuất ngữ cảnh SELinux
    • Xuất trạng thái kho Git
    • Ngày tương đối dễ đọc với con người
    • Nhiều bản vá bảo mật
    • Hỗ trợ màu terminal bright
    • Các bản sửa lỗi nhỏ và thay đổi khác
    • Tệp cấu hình theme.yml để tùy biến màu sắc và biểu tượng

Chạy và cài đặt

  • Trong môi trường hỗ trợ Nix flake, có thể thử eza bằng lệnh sau
    • nix run github:eza-community/eza
  • Nix sẽ build eza rồi chạy nó
  • Để truyền đối số, thêm tùy chọn sau -- như sau
    • nix run github:eza-community/eza -- -ol
  • eza có thể dùng trên Windows, macOS, Linux
  • Cách cài đặt theo từng nền tảng và bản phân phối có trong INSTALL.md

Cấu trúc tùy chọn dòng lệnh

  • Các tùy chọn của eza gần giống ls, nhưng không hoàn toàn giống
  • Tùy chọn hiển thị

    • -1, --oneline: hiển thị một mục trên mỗi dòng
    • -G, --grid: hiển thị các mục theo dạng lưới và đây là mặc định
    • -l, --long: hiển thị thông tin chi tiết mở rộng và thuộc tính
    • -R, --recurse: duyệt đệ quy thư mục
    • -T, --tree: hiển thị đệ quy thư mục theo dạng cây
    • -F, --classify=(when): xuất chỉ dấu loại bên cạnh tên tệp
    • --colour=(when), --color=(when): chỉ định khi nào dùng màu terminal
    • --icons=(when): chỉ định khi nào hiển thị biểu tượng
    • --hyperlink=(when): chỉ định khi nào hiển thị mục dưới dạng hyperlink
    • --absolute=(mode): chỉ định cách hiển thị đường dẫn tuyệt đối của mục
  • Tùy chọn lọc

    • -a, --all: hiển thị tệp ẩn và dot file
    • -d, --treat-dirs-as-files: liệt kê thư mục như tệp thông thường
    • -L, --level=(depth): giới hạn độ sâu đệ quy
    • -s, --sort=(field): chỉ định trường sắp xếp
    • --group-directories-first: hiển thị thư mục trước
    • --group-directories-last: hiển thị thư mục sau
    • -D, --only-dirs: chỉ hiển thị thư mục
    • -f, --only-files: chỉ hiển thị tệp
    • --git-ignore: bỏ qua các tệp có trong .gitignore
    • -I, --ignore-glob=(globs): bỏ qua các tệp khớp mẫu glob phân tách bằng dấu |
    • Truyền --all hai lần sẽ hiển thị cả thư mục ...

Danh sách dài và thông tin liên quan đến Git

  • Có thể dùng các tùy chọn danh sách dài khi sử dụng --long hoặc -l
  • Cung cấp các tùy chọn liên quan đến kích thước tệp và quyền
    • -b, --binary: hiển thị kích thước tệp bằng tiền tố nhị phân
    • -B, --bytes: hiển thị kích thước tệp theo byte không dùng tiền tố
    • -o, --octal-permissions: hiển thị quyền ở dạng bát phân
    • --no-permissions, --no-filesize, --no-user, --no-time: bỏ hiển thị từng trường tương ứng
  • Cung cấp các tùy chọn liên quan đến hệ thống tệp và metadata
    • -H, --links: hiển thị số lượng hard link
    • -i, --inode: hiển thị số inode
    • -M, --mounts: hiển thị chi tiết mount, chỉ dùng trên Linux và macOS
    • -Z, --context: hiển thị ngữ cảnh bảo mật
    • -@, --extended: hiển thị thuộc tính mở rộng và kích thước
    • --total-size: hiển thị kích thước thư mục đệ quy
  • Cũng hỗ trợ đầu ra liên quan đến Git
    • --git: hiển thị trạng thái Git của từng tệp được theo dõi hoặc bị bỏ qua
    • --git-repos: hiển thị trạng thái Git của từng thư mục được theo dõi
    • --git-repos-no-status: chỉ hiển thị thư mục có phải là kho Git hay không và nhanh hơn
    • --no-git: luôn bỏ qua --git, --git-repos, --git-repos-no-status và chặn xuất trạng thái Git
  • Định dạng thời gian hỗ trợ default, iso, long-iso, full-iso, relative, hoặc định dạng tùy chỉnh dạng +<FORMAT>
    • Ví dụ: +%Y-%m-%d %H:%M sẽ xuất theo định dạng 2023-09-30 13:00
    • Chuỗi định dạng chi tiết có thể tham khảo trong trang hướng dẫn eza(1)tài liệu chrono
  • Có thể xem trang hướng dẫn trong thư mục man của kho lưu trữ, và từ phiên bản [0.18.13] - 2024-04-25 cũng có thể dùng man eza ngay trong terminal

Tùy biến theme

  • eza gần đây đã bổ sung hỗ trợ tệp theme.yml
  • Trong theme.yml, có thể chỉ định các tùy chọn theme hiện có vốn dùng được qua biến môi trường LS_COLORSEXA_COLORS
  • Công cụ cũng cung cấp tùy chọn chỉ định biểu tượng khác nhau theo từng loại tệp và phần mở rộng
  • Nếu các biến môi trường cũ đã được thiết lập, chúng vẫn tiếp tục hoạt động để đảm bảo tương thích ngược và được ưu tiên cao hơn
  • Có thể xem các theme dựng sẵn trong kho chính thức eza-themes hoặc tự đóng góp trực tiếp
  • Tệp theme mẫu nằm tại docs/theme.yml
  • Có thể đặt tệp theme trong thư mục được chỉ định bởi biến môi trường EZA_CONFIG_DIR, hoặc mặc định eza sẽ tìm trong $XDG_CONFIG_HOME/eza
  • Xem thêm chi tiết tại eza_colors-explanation.5.mddocs/theme.yml

Đóng góp

1 bình luận

 
GN⁺ 2024-07-23
Ý kiến trên Hacker News
  • Trong danh sách thư mục, ngày tháng dễ đọc với con người đặc biệt gây khó chịu
    Khi tôi đang tìm thứ đã sao chép vào thư mục khoảng 11 giờ sáng hôm qua mà tất cả đều hiện “1 day ago” thì chẳng giúp ích gì. Tôi cần ngày và giờ; các diễn đàn như HN cũng vậy, chỉ cần hiển thị ngày/giờ chính xác trước, rồi nếu cần thì kèm thêm “7 hours ago”
    Tôi không hiểu vì sao lại cố ý bớt thông tin đi, và tự hỏi liệu đây có phải hệ quả của các luồng như cuộn vô hạn hay không

    • Đồng ý. GitHub cũng hiển thị ở commit kiểu “foo.cpp modified last year”, mà nếu không có cách xem thêm thông tin ngày/giờ thì hoàn toàn vô lý
    • Tôi nghĩ các trang có thể dùng thẻ HTML cho mục đích này. Dù chọn định dạng dễ đọc với con người, nếu vẫn giữ lại thời điểm thực thì tiện ích mở rộng có thể thay thế hoặc phủ lên
      Khi viết HTML, tôi luôn cố dùng nó
      (https://developer.mozilla.org/en-US/docs/Web/HTML/Element/ti...)
    • Đúng là một anti-feature đáng kinh ngạc. Thời điểm chuyển đổi cũng mơ hồ. “1 day ago” sẽ thành “2 days ago” khi nào? Theo Google là sau 48 giờ, nên nếu xem sau 47 giờ thì nó hiện “1 day ago”, khiến bạn tưởng như việc đó xảy ra hôm qua
      Ngay cả khi nhớ một ngày cụ thể là ngày sau sinh nhật bạn mình và muốn tìm một mục nào đó, nếu hiển thị chỉ là “three months ago” thì phải lục qua dữ liệu của cả tháng
    • Đây là thiết lập nên có thể đổi sang định dạng ngày bạn muốn
    • Tôi không thích cách này. Có vẻ nó bắt đầu từ các startup Web 2.0, hoặc lan ra từ web app/social web app của các công ty như Google vào khoảng thời gian đó
      Cứ cung cấp thời gian chi tiết trước, rồi nếu muốn thì kèm thêm hiển thị “mấy ngày trước” là được
  • Cũng có lsd, nhưng tôi vẫn thích eza hơn
    Cho những ai quan tâm, đây là các công cụ dòng lệnh hiện đại mà gần đây tôi dùng thay cho công cụ cũ: batcat có tô sáng cú pháp, difftasticdiff tốt hơn, gduncdu cho SSD, zoxidecd hiện đại, fd là phương án thay thế find, rgripgrep, fzf là công cụ tìm kiếm mờ, jless là trình xem JSON có thể gập bằng chuột, dra dùng để tải/cài đặt release asset, lazygit là Git TUI, lazydocker là Docker TUI, yazi là trình quản lý tệp có xem trước hình ảnh, zellijtmux/screen tốt hơn, starship là công cụ cấu hình prompt dùng được trên nhiều shell

    • Bổ sung thêm 4 công cụ tôi hay dùng: task là phương án thay thế Makefile, hyperfinecông cụ benchmark, vegeta là công cụ kiểm thử tải, sdsed tốt hơn và trực quan hơn
      Cũng có bộ ba JSON: jq là bộ xử lý JSON nổi tiếng, jc chuyển đầu ra của nhiều công cụ CLI sang JSON, gron giúp grep JSON dễ hơn
    • Cần cẩn thận rằng fdrg mặc định bỏ qua các mục nằm trong .gitignore. Nếu nghĩ chúng chỉ là bản thay thế đơn giản cho find thì có thể sẽ bất ngờ. Thảo luận liên quan ở [0]
      Khi giới thiệu những công cụ này nên nói rõ điểm đó. Nếu không đọc tài liệu thì rất dễ bỏ lỡ. Cá nhân tôi mong các công cụ kiểu thay thế coreutils này giữ mặc định giống công cụ gốc hơn. Nếu quảng bá là “phương án thay thế đơn giản, nhanh và thân thiện với người dùng cho find” thì nên tôn trọng mặc định gốc để giảm bất ngờ cho người mới. Vì alias luôn tồn tại, tôi nghĩ đặt alias fd='fd --ignore' trong ~/.${SHELL##*/}rc tốt hơn là alias fd='fd --no-ignore'
      Mẹo nhỏ: nếu muốn dùng phiên bản không áp dụng alias thì dùng \command. Ví dụ tôi dùng alias grep='grep --color=always --no-messages --binary-files=without-match, nhưng tùy chọn màu có thể thay đổi biểu diễn ký tự và gây lỗi khi pipe vào curl. Không phải pipe nào cũng vậy, nhưng lần đầu gặp sẽ khá bối rối. Có thể kiểm tra bằng echo "Hello world" | \grep --color=always "Hello" | hexdump rồi !!:s^always^never
      [0] https://github.com/sharkdp/fd/issues/612
    • Liên kết này cũng có một danh sách lớn các công cụ bổ sung mà tôi chưa từng nghe tới nhưng trông khá thú vị
      https://github.com/ibraheemdev/modern-unix
    • Tôi thích việc phần lớn những công cụ này được viết bằng Rust
    • Tôi không thấy zellij tốt hơn screen. Tab/màn hình không được đánh số đúng, nên muốn chuyển thẳng thì phải tự đếm; điều đó khó chấp nhận
  • GNU ls vẫn đang được bảo trì. Có các commit ảnh hưởng tới tệp ls.c vào cả 2024-06-24 và 2024-06-27, tức là chưa tới một tháng trước
    Mailing list của GNU Coreutils cũng khá sôi động. Có vẻ dự án này dùng “maintained” theo nghĩa “được phát triển tích cực”

    • Có vẻ ở đây họ đang nói tới exa, thứ mà eza fork từ đó. exa đã không được bảo trì khoảng 1 năm trước khi người duy nhất có quyền ghi vào repo chính thức đánh dấu deprecated
      Giờ bản fork cũng đã tồn tại khá lâu nên không phải ai cũng biết exa, và ý định của cách diễn đạt này đã trở nên kém rõ hơn nhiều. Vì có phản ứng tương tự, có lẽ đã đến lúc cập nhật câu chữ
    • “Maintained” ở đây không có nghĩa là ls không được bảo trì, mà là một phương án thay thế được bảo trì dưới dạng fork của phương án thay thế lsexa, vốn không còn được bảo trì nữa
  • Sau khi chuyển sang shell fish, mức sử dụng ls giảm 100%. Lệnh tích hợp Alt + l hiển thị nội dung thư mục nên rất hữu ích, và lịch sử shell cũng gọn gàng hơn nhiều

    • Trong Bash, nếu thêm các lệnh như ls vào biến môi trường HISTIGNORE thì cũng có thể giữ history gọn gàng hơn: https://superuser.com/questions/232885/can-you-share-wisdom-...
    • Mẹo hay. Điều loại bỏ phần lớn việc dùng ls trong fish là thiết lập tự động chạy ls khi đổi thư mục
      function ls_on_cd --on-variable PWD
      ls
      end
    • Người dùng Bash cũng có thể bind phím tắt kiểu này. Gán các phím home row bên tay phải vào các hàm như __bash_ctrl_n(), rồi để nhiều công cụ trong dotfiles ghi đè các hàm này. Ví dụ nếu đã cài Git thì thiết lập để __bash_ctrl_e() chạy git statusgit log
    • Trong môi trường của tôi, có lẽ do đã đặt alias ls thành eza nên tính năng này dường như chạy eza. Rốt cuộc có vẻ chỉ là chạy ls
    • Tôi nhận ra hầu hết lần chạy ls đều ngay sau cd, nên đã thêm vào file khởi động. Giờ gần như mọi lần cd đều tự động chạy ls
      Trong Bash, hàm cd() gọi builtin cd "$@" && ls -l, còn trong fish thì sau builtin cd $argv, nếu không có lỗi và không phải chuyển về home thì chạy dir
  • Nói chung tôi thấy các công cụ terminal ép dùng màu để phân biệt loại file hay thuộc tính khá bất tiện. ls của các bản phân phối cũng thường được cấu hình như vậy, nhưng tôi xóa các thiết lập đó và dùng mặc định
    Tôi dùng nền terminal dịu mắt, nhưng các color scheme kiểu này luôn xung đột với nền hoặc có màu khó nhìn. Output của ls hay các công cụ thay thế nó không cần màu; mức thông tin mà ls -AFC cung cấp là đủ

    • Nếu các công cụ dùng Base16 Framework[0] thay vì các chế độ màu “256 color” hay “RGB” tùy ý thì vấn đề sẽ ít hơn nhiều. Vì output sẽ được hiển thị bằng các màu do terminal định nghĩa, được kỳ vọng là có thể đọc được
      [0] https://github.com/chriskempson/base16
      [1] https://tinted-theming.github.io/base16-gallery/
    • Tôi thì hoàn toàn ngược lại, phụ thuộc rất nhiều vào output được tô màu
      Dù vậy vẫn nên có giải pháp, và chỉ cần đặt một giá trị nào đó cho $NO_COLOR. https://no-color.org
      Với những công cụ không kiểm tra và tôn trọng biến môi trường này, việc gửi bug report là hoàn toàn hợp lý
    • https://no-color.org
    • Có thể dùng vivid[1] để chọn theme phù hợp với nền terminal, rồi load biến LS_COLORS được tạo ra vào shell
      [1]: https://github.com/sharkdp/vivid/
  • Thật lạ là README không ghi ezafork của exa

    • Có nói “eza features not in exa”, nên cũng có nhắc đến sự tồn tại của nó. Chỉ là không có link hay ngữ cảnh
  • Tôi tò mò vì sao các phiên bản mới của tiện ích GNU lại được tạo ra với giấy phép MIT nhiều như vậy. Trông có vẻ khá nhiều

    • Người dùng Rust nhìn chung có xu hướng phát hành code dưới giấy phép dễ dãi. Tôi không biết có thống kê nào dễ kiểm chứng không, nhưng gần như mọi thứ trên crates.io, kho package của Rust, đều là MIT hoặc Apache-2.0; các thư viện phổ biến thì chắc chắn là vậy
    • Dự án GNU không phát minh ra ls. GNU coreutils, bao gồm ls, ban đầu cũng là các phiên bản mới của tiện ích độc quyền AT&T hoặc tiện ích theo giấy phép BSD
    • Liên quan, https://github.com/uutils/coreutils là “bản viết lại GNU coreutils đa nền tảng bằng Rust”
  • Vì sao một công cụ thay thế ls lại cần KerberosSSH?
    Nhìn ldd /usr/bin/eza thì thấy nó liên kết với khá nhiều thư viện như libgit2, libgssapi_krb5, libmbedtls, libssh2, libkrb5, libcrypto, libzstd, v.v.

    • Với một thứ cần cho ls thì dependency như vậy là quá nhiều
  • Trên bàn phím QWERTY, eza là tổ hợp ba chữ cái khá kinh khủng. Một trong những ưu điểm của ls là tổ hợp phím có thể gõ rất nhanh
    Có thể tạo alias, nhưng vì các lý do như tương thích nên tôi thấy hơi kỳ

    • Từ khoảng năm 2015 tôi đã alias eza, trước đó là exa, thành ls, ll, lll và chưa từng gặp vấn đề tương thích nào
      Tôi cũng cài sl để tự rèn mình không gõ nhầm
    • Từ góc nhìn người dùng Dvorak, eza trông như một cải tiến. Trên Dvorak, ls tương ứng với p- theo QWERTY, tức cả hai đều là phím ngón út tay phải
    • Bạn có thể giải thích thêm vì sao đặt alias lại kỳ không?
    • Có thể tạo alias với bất kỳ tên nào bạn muốn
    • Những lúc thế này bàn phím AZERTY tỏa sáng
  • Dù sao thì ai còn dùng ls nữa? Chỉ cần dùng tự động hoàn thành bằng phím Tab cho đến khi file cần tìm hiện ra thôi
    Đùa vậy thôi, tôi tò mò vì sao lại cho rằng ls không còn được bảo trì nữa

    • Có vẻ không phải nói đến ls, mà là exa[0], vốn không còn được bảo trì nữa
      [0]https://github.com/ogham/exa
    • Vì lý do nào đó, việc cho rằng nếu phần mềm không được cập nhật định kỳ thì về bản chất nó đã lỗi thời dường như đã trở thành chuẩn mực
    • Tất nhiên ls vẫn đang được bảo trì như một phần của shell hoặc coreutils
      Chỉ là eza là một biến thể của exa, và theo tôi biết thì exa không còn được bảo trì nữa
    • Đây là việc cố tình đánh đồng “maintained” với “actively developed” để khiến công cụ hiện có trông như không được bảo trì