3 pontos por GN⁺ 2024-07-23 | 1 comentários | Compartilhar no WhatsApp
  • eza é uma ferramenta de CLI moderna que substitui o comando de listagem de arquivos ls do Unix/Linux, com o objetivo de oferecer mais recursos e padrões melhores
  • Diferencia com cores os tipos de arquivo e metadados, reconhece links simbólicos, atributos estendidos e informações de Git, e é distribuída como um binário único pequeno e rápido
  • Em relação ao antigo exa, adiciona correção do Grid Bug, hyperlinks, detalhes de pontos de montagem, contexto do SELinux, status de repositório Git, datas relativas legíveis por humanos, correções de segurança, cores de terminal bright e configuração via theme.yml
  • Pode ser instalada no Windows, macOS e Linux e, em ambientes com Nix flake, pode ser compilada e executada com nix run github:eza-community/eza
  • Tem um conjunto de opções parecido com o do ls, mas não idêntico, permitindo ajustar com precisão a forma de exibição da listagem por meio de opções de visualização, filtragem, listagem longa e tema

A experiência de substituição do ls oferecida pelo eza

  • eza é uma alternativa moderna ao antigo comando de listagem de arquivos ls, incluído nos sistemas operacionais Unix e Linux
  • Seu objetivo principal é oferecer uma versão com mais recursos e mais amigável ao usuário do que o ls
  • Diferencia com cores os tipos de arquivo e os metadados
  • Reconhece links simbólicos, atributos estendidos e informações de Git
  • É pequeno, rápido e distribuído como um binário único

Recursos adicionados em relação ao exa

  • O eza inclui vários recursos que não existiam no exa
    • Correção do “The Grid Bug”, introduzido no exa 2021
    • Suporte a hyperlinks
    • Exibição de detalhes de pontos de montagem
    • Exibição de contexto do SELinux
    • Exibição do status de repositórios Git
    • Datas relativas legíveis por humanos
    • Várias correções de segurança
    • Suporte a cores de terminal bright
    • Pequenas correções de bugs e outras mudanças
    • Arquivo de configuração theme.yml para personalizar cores e ícones

Execução e instalação

  • Em ambientes com suporte a Nix flake, é possível testar o eza com o seguinte comando
    • nix run github:eza-community/eza
  • O Nix compila o eza e depois o executa
  • Para passar argumentos, adicione opções após --, assim:
    • nix run github:eza-community/eza -- -ol
  • O eza pode ser usado em Windows, macOS e Linux
  • Os métodos de instalação por plataforma e distribuição estão em INSTALL.md

Estrutura das opções de linha de comando

  • As opções do eza são muito parecidas com as do ls, mas não são exatamente iguais
  • Opções de exibição

    • -1, --oneline: mostra um item por linha
    • -G, --grid: mostra os itens em grade e é o padrão
    • -l, --long: mostra detalhes e atributos estendidos
    • -R, --recurse: percorre diretórios recursivamente
    • -T, --tree: mostra diretórios recursivamente em formato de árvore
    • -F, --classify=(when): exibe um indicador de tipo ao lado do nome do arquivo
    • --colour=(when), --color=(when): define quando usar cores no terminal
    • --icons=(when): define quando mostrar ícones
    • --hyperlink=(when): define quando exibir itens como hyperlinks
    • --absolute=(mode): define como mostrar o caminho absoluto dos itens
  • Opções de filtragem

    • -a, --all: mostra arquivos ocultos e dotfiles
    • -d, --treat-dirs-as-files: lista diretórios como se fossem arquivos comuns
    • -L, --level=(depth): limita a profundidade da recursão
    • -s, --sort=(field): define o campo de ordenação
    • --group-directories-first: mostra diretórios primeiro
    • --group-directories-last: mostra diretórios por último
    • -D, --only-dirs: mostra apenas diretórios
    • -f, --only-files: mostra apenas arquivos
    • --git-ignore: ignora arquivos presentes em .gitignore
    • -I, --ignore-glob=(globs): ignora arquivos com padrões glob separados por pipe
    • Ao passar --all duas vezes, os diretórios . e .. também são exibidos

Listagem longa e informações relacionadas a Git

  • Ao usar --long ou -l, é possível usar as opções de listagem longa
  • Há opções relacionadas a tamanho de arquivo e permissões
    • -b, --binary: mostra o tamanho do arquivo com prefixos binários
    • -B, --bytes: mostra o tamanho do arquivo em bytes, sem prefixos
    • -o, --octal-permissions: mostra permissões em formato octal
    • --no-permissions, --no-filesize, --no-user, --no-time: suprime a saída de cada campo correspondente
  • Há opções relacionadas a sistema de arquivos e metadados
    • -H, --links: mostra o número de hard links
    • -i, --inode: mostra o número do inode
    • -M, --mounts: mostra detalhes de montagem; disponível apenas em Linux e macOS
    • -Z, --context: mostra o contexto de segurança
    • -@, --extended: mostra atributos estendidos e tamanho
    • --total-size: mostra o tamanho de diretórios recursivos
  • Também há suporte a saída relacionada ao Git
    • --git: mostra o status Git de cada arquivo rastreado ou ignorado
    • --git-repos: mostra o status Git de cada diretório rastreado
    • --git-repos-no-status: mostra apenas se o diretório é um repositório Git, com maior velocidade
    • --no-git: ignora sempre --git, --git-repos e --git-repos-no-status, suprimindo a exibição de status Git
  • O formato de hora aceita default, iso, long-iso, full-iso, relative ou um formato personalizado no estilo +<FORMAT>
    • Exemplo: +%Y-%m-%d %H:%M gera saída no formato 2023-09-30 13:00
    • Para mais detalhes sobre strings de formatação, consulte a página de manual eza(1) e a documentação do chrono
  • A página de manual pode ser vista no diretório man do repositório e, desde a versão [0.18.13] - 2024-04-25, também pode ser usada no terminal com man eza

Personalização de tema

  • O eza adicionou recentemente suporte ao arquivo theme.yml
  • Em theme.yml, é possível definir as opções de tema que antes podiam ser usadas nas variáveis de ambiente LS_COLORS e EXA_COLORS
  • Também há opções para definir ícones diferentes por tipo de arquivo e por extensão
  • Se as variáveis de ambiente antigas já estiverem definidas, elas continuam funcionando e têm prioridade, por compatibilidade retroativa
  • Temas prontos podem ser consultados ou receber contribuições no repositório oficial eza-themes
  • O arquivo de tema de exemplo está em docs/theme.yml
  • O arquivo de tema pode ser colocado no diretório definido pela variável de ambiente EZA_CONFIG_DIR ou, por padrão, em $XDG_CONFIG_HOME/eza
  • Mais detalhes estão em eza_colors-explanation.5.md e docs/theme.yml

Contribuição

  • Para contribuir com o eza, é preciso seguir o code of conduct
  • As informações sobre participação prática no desenvolvimento estão em CONTRIBUTING.md

1 comentários

 
GN⁺ 2024-07-23
Comentários do Hacker News
  • As datas legíveis por humanos em listagens de diretório são especialmente irritantes
    Se estou procurando algo que copiei para uma pasta ontem por volta das 11 da manhã e tudo aparece como “1 day ago”, isso não ajuda. Eu preciso da data e da hora, e o mesmo vale para fóruns como o HN: mostre a data/hora exata e, se quiser, acrescente algo como “7 hours ago”
    Não entendo por que remover informação de propósito, e fico curioso se isso é resultado da lógica de fluxos como scroll infinito

    • Concordo. O GitHub também mostra commits como “foo.cpp modified last year”, e isso não faz o menor sentido se não houver uma forma de ver informações de data/hora adicionais
    • Imagino se os sites não poderiam usar uma tag HTML para isso. Mesmo escolhendo um formato mais legível para humanos, se o horário real ficar preservado, extensões podem substituí-lo ou sobrepô-lo
      Eu sempre tento usar isso ao escrever HTML
      (https://developer.mozilla.org/en-US/docs/Web/HTML/Element/ti...)
    • É uma anti-funcionalidade realmente impressionante. O momento da mudança também é ambíguo. Quando “1 day ago” vira “2 days ago”? No Google, isso acontece só depois de 48 horas, então, se você olhar 47 horas depois, ainda aparece “1 day ago”, o que te faz achar por engano que foi ontem
      Mesmo que você se lembre de uma data específica como o dia seguinte ao aniversário de um amigo e tente encontrar algo, se o que aparece for só “three months ago”, você precisa vasculhar material de um mês inteiro
    • Isso é uma configuração, então dá para mudar para o formato de data que você quiser
    • Eu detesto esse estilo. Parece que começou com startups da Web 2.0, ou se espalhou em webapps/aplicativos sociais de empresas como o Google naquela época
      Basta fornecer primeiro o horário detalhado e, se quiser, também mostrar algo como “há alguns dias” junto
  • Existe também o lsd, mas ainda prefiro o eza
    Para quem tiver interesse, hoje em dia há várias ferramentas modernas de linha de comando que eu uso no lugar das antigas: bat é um cat com destaque de sintaxe, difftastic é um diff melhor, gdu é um ncdu para SSD, zoxide é um cd moderno, fd é uma alternativa ao find, rg é o ripgrep, fzf é um buscador difuso, jless é um visualizador de JSON com recolhimento via mouse, dra baixa/instala assets de releases, lazygit é uma TUI para Git, lazydocker é uma TUI para Docker, yazi é um gerenciador de arquivos com pré-visualização de imagens, zellij é melhor que tmux/screen, e starship é uma ferramenta de configuração de prompt para vários shells

    • Se eu acrescentar mais 4 ferramentas que uso com frequência: task é uma alternativa a Makefile, hyperfine é uma ferramenta de benchmark, vegeta é uma ferramenta de teste de carga, e sd é um sed melhor e mais intuitivo
      Também existe o trio do JSON: jq é o processador de JSON mais conhecido, jc converte a saída de várias ferramentas de CLI em JSON, e gron torna JSON fácil de usar com grep
    • É preciso tomar cuidado com o fato de que fd e rg ignoram por padrão itens incluídos no .gitignore. Se você achar que são substitutos diretos do find, pode se surpreender. Há uma discussão sobre isso em [0]
      Ao recomendar esse tipo de ferramenta, esse ponto deveria ser deixado bem claro. É fácil deixar passar se você não ler a documentação. Pessoalmente, eu gostaria que essas alternativas estilo coreutils mantivessem os padrões mais próximos das ferramentas originais. Se a divulgação diz “uma alternativa simples, rápida e amigável ao find”, então os padrões da ferramenta original deveriam ser respeitados para reduzir a surpresa de novos usuários. Como aliases existem, eu acho melhor ter alias fd='fd --ignore' no ~/.${SHELL##*/}rc do que alias fd='fd --no-ignore'
      Como dica: se quiser usar a versão sem o alias aplicado, basta usar \command. Por exemplo, eu uso alias grep='grep --color=always --no-messages --binary-files=without-match e a opção de cor pode alterar a representação dos caracteres, causando erro ao fazer pipe para curl. Não acontece em todos os pipes, mas na primeira vez é bem desconcertante. Dá para verificar com echo "Hello world" | \grep --color=always "Hello" | hexdump e depois !!:s^always^never
      [0] https://github.com/sharkdp/fd/issues/612
    • Esta lista do link também é grande e cheia de ferramentas adicionais que nunca ouvi falar, mas parecem interessantes
      https://github.com/ibraheemdev/modern-unix
    • Gosto do fato de que a maioria dessas ferramentas é escrita em Rust
    • Não achei que o zellij seja melhor que o screen. As abas/telas não são numeradas direito, então, para alternar diretamente, você precisa contar manualmente, e isso é difícil de aceitar
  • O GNU ls é mantido, sim. Houve commits afetando o arquivo ls.c em 2024-06-24 e 2024-06-27, ou seja, faz menos de um mês
    A mailing list do GNU Coreutils também é bem ativa. Parece que esse projeto usa “maintained” no sentido de “em desenvolvimento ativo”

    • Aqui parece que estão se referindo ao exa, que o eza forkou. O exa ficou cerca de um ano sem manutenção até a única pessoa com permissão de escrita no repositório marcá-lo oficialmente como deprecated
      Já faz bastante tempo desde o fork, então nem todo mundo conhece o exa, e a intenção dessa expressão ficou bem mais ambígua. Como há reações parecidas, talvez já seja hora de atualizar a redação
    • Aqui, “maintained” não quer dizer que o ls não seja mantido, mas sim que é uma alternativa mantida, como fork do substituto do ls chamado exa, que deixou de ser mantido
  • Depois que mudei para o shell fish, meu uso de ls caiu 100%. O comando embutido Alt + l mostra o conteúdo do diretório, então é muito útil, e o histórico do shell também fica mais limpo

    • No Bash, também dá para manter o histórico mais limpo adicionando comandos como ls à variável de ambiente HISTIGNORE: https://superuser.com/questions/232885/can-you-share-wisdom-...
    • Boa dica. O que eliminou a maior parte do meu uso de ls no fish foi uma configuração para executar ls automaticamente ao mudar de diretório
      function ls_on_cd --on-variable PWD
      ls
      end
    • Usuários de Bash também podem vincular atalhos desse tipo. Eu associo as teclas da fileira central da mão direita a funções como __bash_ctrl_n(), e deixo várias ferramentas dos meus dotfiles sobrescreverem essas funções. Por exemplo, se o Git estiver instalado, configuro __bash_ctrl_e() para executar git status e git log
    • No meu ambiente, isso provavelmente executa eza porque devo ter definido um alias de ls para eza. No fim, parece que só está executando ls
    • Percebi que a maior parte das execuções de ls acontece logo após cd e adicionei isso ao arquivo de inicialização. Agora quase todo cd executa ls automaticamente
      No Bash, chamo builtin cd "$@" && ls -l na função cd(), e no fish deixo executar dir depois de builtin cd $argv quando não há erro e não é uma ida para a home
  • Em geral, ferramentas de terminal que forçam o uso de cores para diferenciar tipos ou atributos de arquivos são desconfortáveis. O ls da distribuição muitas vezes também vem configurado assim, mas eu removo essas configurações e uso o padrão
    Eu uso um fundo de terminal confortável para os olhos, e esses esquemas de cores sempre entram em conflito com o fundo ou incluem cores difíceis de ver. Não preciso de cores na saída do ls nem de seus substitutos; o que ls -AFC fornece já basta

    • Seria bem menos problemático se as ferramentas usassem o Base16 Framework[0] em vez de modos de cor arbitrários como “256 color” ou “RGB”. A saída seria exibida com cores definidas no terminal, que supostamente seriam legíveis
      [0] https://github.com/chriskempson/base16
      [1] https://tinted-theming.github.io/base16-gallery/
    • Eu sou totalmente o oposto e dependo bastante de saída colorida
      Ainda assim, deveria haver uma solução, e basta definir algum valor em $NO_COLOR. https://no-color.org
      É perfeitamente razoável abrir um bug report para ferramentas que não verificam nem respeitam essa variável de ambiente
    • https://no-color.org
    • Dá para usar vivid[1] para escolher um tema que combine com o fundo do terminal e carregar no shell a variável LS_COLORS gerada
      [1]: https://github.com/sharkdp/vivid/
  • É estranho que o README não diga que eza é um fork do exa

    • Ele fala em “eza features not in exa”, então ao menos menciona a existência. Só que sem link nem contexto
  • Fico curioso sobre por que tantas versões novas de utilitários GNU estão sendo feitas com licença MIT. Parece haver bastante disso

    • Usuários de Rust, em geral, tendem a publicar código sob licenças permissivas. Não sei se existem estatísticas fáceis de verificar, mas quase tudo no crates.io, o repositório de pacotes Rust, é MIT ou Apache-2.0, e imagino que as bibliotecas populares com certeza sejam
    • O projeto GNU não inventou o ls. O GNU coreutils, incluindo o ls, originalmente também eram novas versões de utilitários proprietários da AT&T ou utilitários sob licença BSD
    • Relacionado a isso, https://github.com/uutils/coreutils é uma “reimplementação multiplataforma do GNU coreutils em Rust”
  • Por que um substituto de ls precisa de Kerberos e SSH?
    ldd /usr/bin/eza mostra que ele está vinculado a várias bibliotecas, como libgit2, libgssapi_krb5, libmbedtls, libssh2, libkrb5, libcrypto, libzstd etc.

    • São dependências demais para algo que supostamente seria só um ls
  • Em um teclado QWERTY, eza é uma combinação de três letras bem horrível. Uma das vantagens do ls é justamente ser uma combinação de teclas muito rápida de digitar
    Dá para criar um alias, mas por questões como compatibilidade isso parece meio estranho

    • Desde por volta de 2015 eu defino alias de eza, e antes disso de exa, como ls, ll e lll, e nunca tive problemas de compatibilidade
      Também deixo sl instalado para me treinar a não digitar errado
    • Do ponto de vista de quem usa Dvorak, eza parece uma melhora. No Dvorak, ls vira p- no equivalente ao QWERTY, então ambas ficam na tecla do dedo mínimo da mão direita
    • Pode explicar melhor por que definir alias pareceria estranho?
    • Você pode criar um alias com qualquer nome que quiser
    • É nessas horas que o teclado AZERTY brilha
  • Afinal, quem usa ls? A pessoa só fica apertando tab para autocompletar até aparecer o arquivo de que precisa
    Brincadeiras à parte, fiquei curioso sobre por que afirmam que ls não é mais mantido

    • Acho que não estão se referindo ao ls, mas ao exa[0], que não recebe mais manutenção
      [0]https://github.com/ogham/exa
    • Por algum motivo, virou padrão pensar que, se um software não é atualizado regularmente, ele é essencialmente obsoleto
    • Claro que o ls continua sendo mantido como parte do shell ou do coreutils
      Só que o eza é um fork do exa e, até onde eu sei, o exa não é mais mantido
    • Estão confundindo de propósito “maintained” com “actively developed” para fazer parecer que a ferramenta existente não recebe manutenção