Um shell moderno que trata tudo como dados estruturados em vez de texto bruto. Pipelines trabalham com tabelas, registros e listas — não apenas strings. Pense nele como um shell que entende JSON, CSV, TOML e YAML nativamente.
| Plataforma | Comando |
|---|
| macOS (Homebrew) | brew install nushell |
| Windows (Winget) | winget install nushell |
| Windows (Chocolatey) | choco install nushell |
| Windows (Scoop) | scoop install nu |
| Ubuntu/Debian | sudo apt install nushell (ou baixar dos releases do GitHub) |
| Arch Linux | sudo pacman -S nushell |
| Fedora/RHEL | sudo dnf install nushell |
| Cargo (Todas as plataformas) | cargo install nu |
| Nix | nix-env -iA nixpkgs.nushell |
Iniciar: Execute nu de qualquer shell para iniciar o Nushell. Definir como shell padrão: chsh -s $(which nu)
Pipelines do Nushell passam dados estruturados (tabelas, registros, listas), não texto:
# Shell tradicional: texto → grep → awk → texto
# Nushell: tabela → where → select → tabela
ls | where size > 1mb | sort-by size --reverse | first 5
Tipos de dados: strings, inteiros, floats, booleanos, datas, durações, tamanhos de arquivo, listas, registros, tabelas
| Comando | Descrição |
|---|
ls | Listar diretório como uma tabela estruturada |
ls -la | Listar todos os arquivos (incluindo ocultos) em formato longo |
cd path/to/dir | Mudar diretório |
cp source dest | Copiar arquivos ou diretórios |
mv source dest | Mover ou renomear arquivos |
rm file | Remover arquivos |
mkdir dirname | Criar diretório |
open file.json | Abrir arquivo como dados estruturados (detecta formato automaticamente) |
open file.csv | Abrir CSV como tabela |
open file.toml | Abrir TOML como registro |
save output.json | Salvar saída do pipeline para arquivo |
cat file.txt | Exibir conteúdo do arquivo como texto |
ps | Mostrar processos em execução como tabela |
sys | Mostrar informações do sistema |
which command | Encontrar localização do comando |
help commands | Listar todos os comandos disponíveis |
help <command> | Mostrar ajuda para um comando específico |
| Comando | Descrição |
|---|
ls | where size > 10mb | Filtrar arquivos maiores que 10 MB |
ls | where name =~ "\.rs$" | Filtrar por regex no nome do arquivo |
ls | where type == "dir" | Mostrar apenas diretórios |
ls | where modified > 2day | Arquivos modificados nos últimos 2 dias |
ls | select name size | Mostrar apenas colunas name e size |
ls | reject type | Remover a coluna type |
ls | get name | Extrair apenas a coluna name como lista |
ls | first 5 | Mostrar primeiras 5 entradas |
ls | last 3 | Mostrar últimas 3 entradas |
ls | skip 10 | Pular primeiras 10 entradas |
ls | nth 0 2 4 | Selecionar entradas por índice |
ls | length | Contar número de entradas |
ls | uniq | Remover entradas duplicadas |
| Comando | Descrição |
|---|
ls | sort-by size | Ordenar por tamanho crescente |
ls | sort-by size --reverse | Ordenar por tamanho decrescente |
ls | sort-by name | Ordenar alfabeticamente |
ls | group-by type | Agrupar entradas por tipo |
ls | group-by {get name | path parse | get extension} | Agrupar por extensão de arquivo |
| Comando | Descrição |
|---|
"hello world" | str upcase | Converter para maiúsculas |
"HELLO" | str downcase | Converter para minúsculas |
" hello " | str trim | Remover espaços em branco |
"hello" | str contains "ell" | Verificar se string contém substring |
"hello" | str replace "l" "L" | Substituir caracteres |
"hello world" | split row " " | Dividir string em lista |
["hello" "world"] | str join ", " | Juntar lista em string |
"hello" | str length | Obter comprimento da string |
"hello" | str starts-with "he" | Verificar prefixo da string |
| Comando | Descrição |
|---|
open data.json | get field_name | Acessar um campo em JSON |
open data.json | get nested.field | Acessar campos aninhados |
{name: "Alice", age: 30} | Criar um registro |
[1 2 3 4 5] | Criar uma lista |
[[name age]; [Alice 30] [Bob 25]] | Criar uma tabela |
$data | to json | Converter para JSON |
$data | to csv | Converter para CSV |
$data | to toml | Converter para TOML |
$data | to yaml | Converter para YAML |
$data | to md | Converter para tabela Markdown |
| Comando | Descrição |
|---|
[1 2 3 4] | math sum | Soma de valores |
[1 2 3 4] | math avg | Média de valores |
[1 2 3 4] | math max | Valor máximo |
[1 2 3 4] | math min | Valor mínimo |
[1 2 3 4] | math median | Valor mediano |
ls | get size | math sum | Tamanho total dos arquivos listados |
1 + 2 | Aritmética básica |
10 / 3 | Divisão |
2 ** 8 | Exponenciação |
| Comando | Descrição |
|---|
http get https://api.example.com/data | Buscar URL e analisar resposta |
http post https://api.example.com/data {key: "value"} | Requisição POST com corpo |
fetch url | get field | Buscar e extrair campo específico |
# Variáveis (imutáveis por padrão)
let name = "Alice"
let count = 42
let files = (ls | where size > 1mb)
# Variáveis mutáveis
mut counter = 0
$counter += 1
# If/else
if $count > 10 { "big" } else { "small" }
# Loops
for file in (ls) { print $file.name }
ls | each { |row| $row.name | str upcase }
# Comandos personalizados (funções)
def greet [name: string] { $"Hello, ($name)!" }
greet "World"
| Arquivo | Finalidade |
|---|
$nu.config-path | Configuração principal (config.nu) |
$nu.env-path | Configuração de ambiente (env.nu) |
# Mostrar localização do arquivo de configuração
$nu.config-path
# Editar configuração
config nu # Abrir config.nu no editor
config env # Abrir env.nu no editor
# Em config.nu
$env.config = {
show_banner: false # Desabilitar banner de boas-vindas
table: {
mode: rounded # Estilo de tabela: rounded, compact, thin, none
}
completions: {
algorithm: "fuzzy" # Completação fuzzy com Tab
}
history: {
max_size: 10000 # Entradas de histórico para manter
file_format: "sqlite" # sqlite ou plaintext
}
}
# Encontrar maiores arquivos em um projeto
ls **/* | where type == "file" | sort-by size --reverse | first 20
# Analisar e consultar API JSON
http get https://api.github.com/repos/nushell/nushell | select stargazers_count forks_count
# Converter entre formatos
open data.csv | to json | save data.json
# Analisar arquivos de log
open access.log | lines | parse "{ip} - - [{date}] \"{method} {path} {proto}\" {status} {size}"
| where status == "404" | group-by path | sort-by -r
# Visão geral rápida do sistema
sys | get host
ps | sort-by cpu --reverse | first 10
| Recurso | Bash/Zsh | Nushell |
|---|
| Modelo de dados | Fluxos de texto | Tabelas estruturadas |
| Análise de saída | grep, awk, sed | where, select, get integrados |
| Manipulação de JSON | Requer jq | Nativo (open file.json) |
| Tratamento de erros | Códigos de saída | Mensagens de erro ricas |
| Completação com Tab | Básica | Sensível ao contexto |
| Sistema de tipos | Nenhum | Inteiros, strings, datas, tamanhos, etc. |
| Curva de aprendizado | Familiar | Nova sintaxe para aprender |
| Comandos externos | Nativo | Totalmente suportado |