Nushell
Antes de mergulharmos no Nushell, é importante contextualizar minha experiência prévia. Por muito tempo, o Zsh tem sido meu shell padrão, atendendo excepcionalmente bem às minhas necessidades, especialmente quando combinado com o Oh My Zsh e alguns plugins cuidadosamente selecionados. Se você estiver curioso sobre como otimizei meu ambiente Zsh, recomendo conferir o artigo Turbinando o Shell. Dito isso, para que a mudança para o Nushell seja justificável, ele precisa não apenas igualar, mas superar significativamente as expectativas estabelecidas pelo Zsh.
Em 2022, minha busca por maior produtividade no terminal me levou ao Nushell. Embora inicialmente entusiasmado, decidi adiar a transição, pois o projeto ainda não havia atingido a versão 1.0. Agora, em 2025, com o Nushell demonstrando maturidade significativa, chegou o momento de integrá-lo ao meu workflow profissional.
Instalação
Não vamos reinventar a roda, veja instalação na documentação oficial e instale como for melhor para você.
brew install nushell
nu --version
0.101.0
nu
Abra o seu terminal digite nu e já estamos dentro dele.
Conceito
O Nushell (ou simplesmente “nu”) é um shell moderno, desenvolvido em Rust, que oferece uma abordagem inovadora em comparação com shells tradicionais como Bash ou Zsh.
Seu diferencial está no foco no gerenciamento e manipulação de dados estruturados, proporcionando uma apresentação mais refinada e intuitiva dos resultados.
Para ilustrar as capacidades do Nushell, vamos começar com um exemplo simples: o comando ls. Este comando básico, que lista arquivos e diretórios, serve como uma excelente demonstração inicial. Para uma comparação direta, abri dois terminais lado a lado: à esquerda, meu familiar Zsh, e à direita, o Nushell.

À primeira vista, é evidente que o Nushell apresenta a saída como uma tabela mais organizada e visualmente atraente. No entanto, a verdadeira inovação não está na aparência, mas na abordagem subjacente. Não seria prudente mudar meu terminal favorito apenas por questões estéticas, especialmente considerando que o ZSH oferece uma variedade de plugins com benefícios significativos.
O diferencial do Nushell está em sua capacidade de processar dados estruturados nativamente, como tabelas, JSON, YAML e XML, em contraste com os shells tradicionais que tratam tudo como texto puro. Esta característica facilita enormemente a manipulação e filtragem de dados.
Para apreciar plenamente o poder dessa abordagem, é importante primeiro compreender como um shell clássico opera. Usuários intermediários já estão familiarizados com o conceito de Pipes, que essencialmente consiste em direcionar a saída de um comando como entrada para outro.
Por exemplo no Zsh se quisermos mostrar só os arquivos .json faríamos
❯ ls | egrep .json
package-lock.json
package.json
tsconfig.json
Fizemos a saída do comando ls com todos os arquivos ser a entrada do egrep e este irá mostrar somente aqueles que possui .json.
Poderíamos continuar injetando a saída de um comando como o input de outro comando e mais outro até chegar no resultado que queremos.
É eu sei que podemos fazer isso de outras maneiras, mas o que importa é o conceito!
❯ ls | egrep .json | grep package
package-lock.json
package.json
O Nushell revoluciona o conceito de shell, pois sua saída não se limita a mero texto no console, mas consiste em dados estruturados, o que transforma completamente o cenário de uso. A tabela elegante que observamos anteriormente tem um valor muito além de sua apresentação estética; sua verdadeira importância reside na estrutura subjacente dos dados.
No Nushell, a canalização (Pipes) oferece possibilidades mais amplas de manipulação, com diversos comandos à disposição. Um exemplo notável é o | where, que permite iniciar processos de filtragem sofisticados. Para explorar as potencialidades desse sistema, podemos utilizar a flag --help e descobrir uma gama de opções disponíveis para manipulação de dados.
ls | where --help
Filter values based on a row condition.
This command works similar to 'filter' but allows extra shorthands for working with
tables, known as "row conditions". On the other hand, reading the condition from a variable is
not supported.
Search terms: filter, find, search, condition
Usage:
> where <row_condition>
Flags:
-h, --help: Display the help message for this command
Parameters:
row_condition <condition>: Filter condition.
Examples:
Filter rows of a table according to a condition
> [{a: 1} {a: 2}] | where a > 1
╭───┬───╮
│ # │ a │
├───┼───┤
│ 0 │ 2 │
╰───┴───╯
Filter items of a list according to a condition
> [1 2] | where {|x| $x > 1}
╭───┬───╮
│ 0 │ 2 │
╰───┴───╯
List all files in the current directory with sizes greater than 2kb
> ls | where size > 2kb
List only the files in the current directory
> ls | where type == file
List all files with names that contain "Car"
> ls | where name =~ "Car"
List all files that were modified in the last two weeks
> ls | where modified >= (date now) - 2wk
Find files whose filenames don't begin with the correct sequential number
> ls | where type == file | sort-by name --natural | enumerate | where {|e| $e.item.name !~ $'^($e.index + 1)' } | each {|| get item }
Find case-insensitively files called "readme", without an explicit closure
> ls | where ($it.name | str downcase) =~ readme
same as above but with regex only
> ls | where name =~ '(?i)readme'
Agora vamos rever novamente a nossa tabela com o comando ls -l para ver mais detalhes.

As colunas mostram o que podemos filtrar então já vamos partir pro comando...

O que fizemos até agora pode não parecer suficiente para justificar uma mudança cultural, especialmente considerando nossa familiaridade com comandos existentes, alguns dos quais já temos atalhos e executamos com grande rapidez. No entanto, é importante ponderar se essa mudança realmente vale a pena.
Ao refletirmos, podemos destacar alguns pontos importantes:
- A documentação de ajuda no Nushell é significativamente mais abrangente e bem estruturada.
- A necessidade de memorizar argumentos específicos é reduzida, pois a maioria das operações pode ser realizada canalizando os dados para comandos como
| wheree outras instruções similares.
O aspecto fundamental a ser compreendido é que, diferentemente dos shells tradicionais que invariavelmente produzem texto como saída, o Nushell gera dados estruturados. Esses dados podem ser originados de praticamente qualquer formato, e o Nushell os converte para seu próprio formato interno. Esta característica permite que a saída de um comando seja facilmente utilizada como entrada para outros comandos através de pipes, criando um fluxo de trabalho mais coeso e poderoso.
A vantagem do Nushell é que ele consegue tranformar entradas de texto em dados estruturados.
Se fossemos fazer o comando acima para filtrar pelos arquivos (não pastas) menores que 1kb.

Fazer esse comando com um shell clássico envolveria conhecer outros comandos, como por exemplo o find, pois se fosse fazer com o ls seria muito mais trabalhoso.
Seria algo como o comando abaixo:
# Veja o nível de conhecimento necessário que precisa
❯ find . -maxdepth 1 -type f -size -1024c -exec basename {} \;
README.md
package.json
tsconfig.json
Nushell vs Posix
O Nushell, por ser um shell não-POSIX, apresenta algumas diferenças importantes em relação ao Zsh e outros shells que vale a pena considerar.
O Nushell possui sua própria linguagem de script com extensão .nu, sobre a qual falaremos mais adiante. A principal diferença é que ele não executa scripts shell tradicionais (.sh) diretamente, por não ser POSIX-compliant e devido à forma como as saídas são geradas.
No momento, não estou interessado, nem é oportuno, substituir completamente os scripts Bash por Nushell. Não desejo reescrever todos os scripts que utilizamos no trabalho, e isso não é necessário.
Primeiramente, devemos aprender a utilizar e conhecer o poder do Nushell para, posteriormente, considerar a criação de scripts específicos para ele. Vamos andar antes de correr.
A proposta é considerar o uso do Nushell no nosso dia a dia como shell padrão, que é carregado quando o terminal é aberto, mantendo o Bash e o Zsh para desenvolver e testar nossos Shell Scripts existentes, que ainda têm muita vida pela frente.
Mesmo utilizando o Nushell podemos chamar qualquer script desenvolvido em Bash uma vez que o #!/bin/bash aponta quem será o executor do script.
Por exemplo o seguinte script desenvolvido em bash.
#!/bin/bash
echo "Bem vindo! O que você quer fazer?"
echo "1. Listar arquivos"
echo "2. Listar variáveis de ambiente do no bash"
echo "3. Ver espaço em disco"
read -p "Digite sua escolha (1-3): " opcao
case $opcao in
1)
ls -la
;;
2)
env
;;
3)
df -h
;;
*)
echo "Opção inválida!"
;;
esac
Vamos invocar normalmente mesmo dentro de um Nushell.
# Veja que invocando o um shell script tradicional quem esta processando é o bash
~/teste> ./script.sh
Bem vindo! O que você quer fazer?
1. Listar arquivos
2. Listar variáveis de ambiente do no bash
3. Ver espaço em disco
Digite sua escolha (1-3): 1
total 48
drwxr-xr-x@ 5 davidprata staff 160 10 Fev 08:18 .
drwxr-x---+ 67 davidprata staff 2144 10 Fev 08:51 ..
-rw-r--r--@ 1 davidprata staff 1319 14 Jan 10:36 otel.crt
-rw-r--r--@ 1 davidprata staff 15202 13 Jan 14:31 pod.yaml
-rwxr-xr-x@ 1 davidprata staff 337 10 Fev 08:18 script.sh
Não teremos nenhum problema no uso diário!
Observe que as saídas são equivalentes ao shell que executou o script, neste caso o Bash. Consequentemente, o comando ls -la produziu a saída de texto padrão característica do Bash.
Ao desenvolver um script .nu, caso seja necessário executar um comando de shell clássico do Bash dentro do script Nushell, basta utilizar a sintaxe bash -c "comando".
Abordaremos os scripts Nu mais detalhadamente em um momento posterior. Por ora, considerei relevante esclarecer essa dúvida, pois ela pode surgir frequentemente durante a transição para o Nushell.