Pular para o conteúdo

Nushell

Shell moderno com dados estruturados que trata a saída de comandos como tabelas e suporta pipelines com dados tipados, filtragem e scripts multiplataforma.

ComandoDescrição
brew install nushellInstalar no macOS com Homebrew
cargo install nuInstalar a partir do crates.io
winget install nushellInstalar no Windows com winget
sudo apt install nushellInstalar no Debian/Ubuntu
pacman -S nushellInstalar no Arch Linux
nix-env -i nushellInstalar no NixOS
nuIniciar o Nushell
nu --versionMostrar a versão instalada
nu -c "ls"Executar um único comando e sair
nu script.nuExecutar um arquivo de script Nushell
chsh -s /usr/bin/nuDefinir Nushell como shell padrão
ComandoDescrição
sysMostrar informações completas do sistema
sys hostMostrar detalhes do host (nome, SO, kernel)
sys memMostrar uso de memória
sys cpuMostrar informações da CPU
sys disksMostrar uso de disco
sys netMostrar interfaces de rede
sys tempMostrar sensores de temperatura
date nowMostrar data e hora atuais
date now | format date "%Y-%m-%d"Formatar a data atual
$nu.home-pathMostrar caminho do diretório home
$nu.os-infoMostrar detalhes do SO
ComandoDescrição
lsListar arquivos como tabela estruturada
ls -lListagem longa com detalhes
ls -aMostrar arquivos ocultos
ls **/*.rsGlob recursivo para arquivos Rust
ls | where size > 1mbFiltrar arquivos maiores que 1MB
ls | where type == dirFiltrar apenas diretórios
ls | sort-by modified -rOrdenar por data de modificação (mais recente primeiro)
ls | sort-by size -rOrdenar por tamanho decrescente
ls | get nameObter apenas a coluna de nomes dos arquivos
ComandoDescrição
psListar processos como tabela
ps | where cpu > 10Encontrar processos usando >10% de CPU
ps | where name =~ "node"Encontrar processos por padrão de nome
ps | sort-by mem -r | first 10Top 10 processos por memória
ps | where pid == 1234Encontrar processo por PID
ComandoDescrição
helpMostrar ajuda geral
help commandsListar todos os comandos disponíveis
help lsMostrar ajuda para um comando específico
help operatorsListar operadores disponíveis
help escapesMostrar sequências de escape de string
ComandoDescrição
ls | select name sizeSelecionar colunas específicas
ls | reject modifiedRemover colunas específicas
ls | rename filename filesizeRenomear colunas
ls | first 5Obter as primeiras 5 linhas
ls | last 3Obter as últimas 3 linhas
ls | skip 10Pular as primeiras 10 linhas
ls | lengthContar o número de linhas
ls | reverseInverter a ordem das linhas
ls | shuffleAleatorizar a ordem das linhas
ls | flattenAchatar tabelas aninhadas
ls | columnsListar nomes das colunas
ComandoDescrição
ls | where size > 1mbFiltrar por comparação
ls | where name =~ "test"Filtrar por correspondência regex
ls | where name starts-with "src"Filtrar por prefixo
ls | where name ends-with ".md"Filtrar por sufixo
ls | where type in ["file" "dir"]Filtrar por lista de valores
ls | sort-by size -rOrdenar decrescente
ls | sort-by name -iOrdenar sem diferenciar maiúsculas
ls | uniq-by typeRemover duplicatas por coluna
ls | group-by typeAgrupar linhas por valor da coluna
ComandoDescrição
ls | each { |it| $it.name }Transformar cada linha
ls | par-each { |it| $it.name }Transformar em paralelo
ls | update size { |it| $it.size / 1kb }Atualizar valores da coluna
ls | insert label { |it| $it.name + "-file" }Adicionar nova coluna
ls | reduce -f 0 { |it, acc| $acc + $it.size }Acumular valores
ls | enumerateAdicionar coluna de índice
ls | window 3Janela deslizante de 3 linhas
ls | zip [1 2 3]Combinar com outra lista
ls | transposeTrocar linhas e colunas
ComandoDescrição
42Inteiro
3.14Ponto flutuante
"hello"String
true / falseBooleano
nullValor nulo
2024-01-15Data
5sec / 3min / 2hrDuração
1kb / 5mb / 2gbTamanho de arquivo
0b1010Literal binário
0xffLiteral hexadecimal
ComandoDescrição
[1 2 3]Lista
[1 2 3] | append 4Anexar à lista
[1 2 3] | prepend 0Inserir no início da lista
{name: "Alice", age: 30}Registro
{a: 1} | merge {b: 2}Mesclar registros
[[name age]; ["Alice" 30] ["Bob" 25]]Literal de tabela
0..9Intervalo (0 a 9)
0..<9Intervalo exclusivo (0 a 8)
0..2..10Intervalo com passo (0, 2, 4, 6, 8, 10)
ComandoDescrição
"42" | into intString para inteiro
"3.14" | into floatString para ponto flutuante
42 | into stringNúmero para string
"true" | into boolString para booleano
"2024-01-15" | into datetimeString para datetime
1024 | into filesizeNúmero para tamanho de arquivo
5 | into duration --unit secNúmero para duração
42 | into binaryNúmero para binário
[1 2 3] | into recordLista para registro
{a: 1} | into recordConverter para registro
ComandoDescrição
open data.jsonAbrir e analisar arquivo JSON
open data.csvAbrir e analisar arquivo CSV
open data.yamlAbrir e analisar arquivo YAML
open data.tomlAbrir e analisar arquivo TOML
open data.xmlAbrir e analisar arquivo XML
open data.tsvAbrir e analisar arquivo TSV
open data.sqliteAbrir banco de dados SQLite
open file.txtAbrir como texto simples
open data.json | get usersAbrir e navegar nos dados
ComandoDescrição
"hello" | save hello.txtSalvar string em arquivo
ls | save files.jsonSalvar tabela como JSON
ls | save files.csvSalvar tabela como CSV
ls | save files.yamlSalvar tabela como YAML
open data.json | to csvConverter JSON para CSV
open data.csv | to jsonConverter CSV para JSON
open data.json | save data.yamlConverter entre formatos
open data.csv | save -f data.csvForçar sobrescrita do arquivo existente
"line1\nline2" | save -a log.txtAnexar ao arquivo
ComandoDescrição
open file.txt | linesDividir arquivo em linhas
open file.txt | lines | lengthContar linhas do arquivo
open file.csv | where status == "active"Filtrar linhas do CSV
open file.json | select name emailSelecionar campos do JSON
open file.json | to yaml | save file.yamlConverter JSON para YAML
glob "**/*.md" | each { |f| open $f }Abrir todos os arquivos correspondentes
ComandoDescrição
"hello world" | str upcaseConverter para maiúsculas
"HELLO" | str downcaseConverter para minúsculas
"hello" | str capitalizeCapitalizar a primeira letra
" hello " | str trimRemover espaços em branco
"hello" | str trim --char "h"Remover caractere específico
"hello" | str reverseInverter string
ComandoDescrição
"hello world" | str replace "world" "nu"Substituir primeira ocorrência
"aabaa" | str replace -a "a" "x"Substituir todas as ocorrências
"hello world" | str replace -r '\w+' 'word'Substituir com regex
"hello world" | str contains "world"Verificar se a string contém
"hello world" | str starts-with "hello"Verificar prefixo
"hello world" | str ends-with "world"Verificar sufixo
"hello world" | str index-of "world"Encontrar posição da substring
ComandoDescrição
"hello world" | split row " "Dividir por delimitador
"a,b,c" | split row ","Dividir string estilo CSV
"hello" | split charsDividir em caracteres
["hello" "world"] | str join " "Juntar lista em string
["a" "b" "c"] | str join ","Juntar com vírgula
"hello" | str lengthObter comprimento da string
"hello world" | str substring 0..5Extrair substring
# Interpolação básica
let name = "World"
$"Hello, ($name)!"

# Interpolação com expressão
$"Total: (1 + 2 + 3)"

# Strings de múltiplas linhas
$"Line 1
Line 2
Line 3"

# Strings brutas (sem escapes)
r#'C:\Users\path'#
ComandoDescrição
def greet [name: string] { $"Hello, ($name)!" }Comando personalizado básico
def add [a: int, b: int] -> int { $a + $b }Comando com anotações de tipo
def greet [name = "World"] { ... }Comando com parâmetro padrão
def "git branches" [] { git branch | lines }Nome estilo subcomando
def --wrapped cmd [...rest] { ... }Aceitar argumentos extras
ComandoDescrição
let x = 42Variável imutável
mut x = 0; $x = $x + 1Variável mutável
const PI = 3.14159Constante em tempo de compilação
if $x > 0 { "pos" } else { "neg" }Expressão condicional
match $x { 1 => "one", 2 => "two", _ => "other" }Correspondência de padrões
for item in [1 2 3] { print $item }Laço for
while $x < 10 { $x = $x + 1 }Laço while
loop { if $x > 10 { break }; $x += 1 }Laço infinito com break
try { risky_op } catch { "failed" }Tratamento de erros
# Função com parâmetro de flag
def greet [
  name: string       # Nome para cumprimentar
  --excited (-e)     # Usar ponto de exclamação
] {
  if $excited {
    $"Hello, ($name)!"
  } else {
    $"Hello, ($name)."
  }
}

# Função com parâmetros rest
def sum [...nums: int] -> int {
  $nums | math sum
}

# Função com entrada de pipeline
def double-all [] {
  each { |x| $x * 2 }
}
# Uso: [1 2 3] | double-all
ComandoDescrição
[1 2 3 4 5] | math sumSoma dos valores
[1 2 3 4 5] | math avgMédia dos valores
[1 2 3 4 5] | math minValor mínimo
[1 2 3 4 5] | math maxValor máximo
[1 2 3 4 5] | math medianValor mediano
[1 2 3 4 5] | math stddevDesvio padrão
[1 2 3 4 5] | math varianceVariância
[1 2 3] | math productProduto dos valores
10 | math absValor absoluto
10 | math sqrtRaiz quadrada
2 | math round -p 2Arredondar com precisão
10 | math log 2Logaritmo na base 2
ComandoDescrição
http get https://api.example.com/dataRequisição GET
http post https://api.example.com/data {name: "test"}Requisição POST com JSON
http put https://api.example.com/data/1 {name: "updated"}Requisição PUT
http delete https://api.example.com/data/1Requisição DELETE
http get url --headers [Accept application/json]GET com cabeçalhos personalizados
http get url | get dataGET e extrair campo
port 8080Verificar se a porta está em uso
# Buscar e processar API JSON
let users = (http get "https://jsonplaceholder.typicode.com/users")
$users | select name email | first 5

# POST com cabeçalhos e corpo
http post "https://api.example.com/items" {
  name: "New Item"
  price: 29.99
} --headers [Authorization $"Bearer ($env.API_TOKEN)"]
ComandoDescrição
$nu.config-pathMostrar caminho do arquivo de configuração
$nu.env-pathMostrar caminho do arquivo de configuração de ambiente
$nu.default-config-dirMostrar diretório de configuração
config nuAbrir configuração no editor
config envAbrir configuração de ambiente no editor
ComandoDescrição
$env.config.show_banner = falseDesativar banner de inicialização
$env.config.buffer_editor = "vim"Definir editor para Ctrl+O
$env.config.history.file_format = "sqlite"Usar histórico SQLite
$env.config.history.max_size = 100_000Definir máximo de entradas no histórico
$env.config.completions.external.enable = trueAtivar completações externas
$env.config.cursor_shape.emacs = "line"Definir formato do cursor
$env.config.footer_mode = "25"Mostrar rodapé para tabelas grandes
$env.config.table.mode = "rounded"Definir estilo de borda da tabela
ComandoDescrição
$env.PATH = ($env.PATH | prepend "/usr/local/bin")Adicionar ao PATH
$env.PATH = ($env.PATH | append "~/.local/bin")Anexar ao PATH
$env.EDITOR = "vim"Definir variável de ambiente
alias ll = ls -lCriar alias de comando
source ~/.config/nushell/custom.nuCarregar configuração adicional
# env.nu — configuração de ambiente
$env.PATH = ($env.PATH | split row (char esep)
  | prepend "/usr/local/bin"
  | prepend ($env.HOME | path join ".cargo" "bin")
  | append ($env.HOME | path join "go" "bin")
)

$env.EDITOR = "nvim"
$env.VISUAL = "nvim"
$env.PAGER = "less"
# config.nu — configuração do shell
$env.config = {
  show_banner: false
  buffer_editor: "nvim"
  table: {
    mode: rounded
    index_mode: auto
    trim: {
      methodology: wrapping
      wrapping_try_keep_words: true
    }
  }
  history: {
    file_format: "sqlite"
    max_size: 100_000
    sync_on_enter: true
    isolation: false
  }
  completions: {
    case_sensitive: false
    quick: true
    partial: true
    algorithm: "prefix"
    external: {
      enable: true
      max_results: 100
    }
  }
}
ComandoDescrição
module greet { export def hello [] { "hi" } }Definir um módulo inline
use greet helloImportar comando do módulo
use greet *Importar tudo do módulo
use utils.nuImportar de arquivo de módulo
overlay use spamAtivar overlay
overlay hide spamDesativar overlay
overlay listListar overlays ativos
# arquivo: utils.nu
export def "str kebab" [] {
  $in | str downcase | str replace -a " " "-"
}

export def "str title" [] {
  $in | split row " "
  | each { |w| $w | str capitalize }
  | str join " "
}

# Uso:
# use utils.nu
# "Hello World" | str kebab    # "hello-world"
# "hello world" | str title    # "Hello World"
ComandoDescrição
open data.dbAbrir banco de dados SQLite
open data.db | query db "SELECT * FROM users"Executar consulta SQL
open data.db | query db "SELECT * FROM users WHERE age > 30"Consulta filtrada
open data.db | schemaMostrar esquema do banco de dados
[[name age]; ["Alice" 30]] | into sqlite data.dbCriar SQLite a partir de tabela
ls | into sqlite -t files data.dbSalvar tabela no SQLite
ComandoDescrição
plugin listListar plugins instalados
plugin add /path/to/pluginRegistrar um plugin
plugin rm plugin_nameRemover um plugin
plugin use plugin_nameCarregar um plugin
cargo install nu_plugin_formatsInstalar plugin de formatos
cargo install nu_plugin_queryInstalar plugin de consultas
cargo install nu_plugin_gstatInstalar plugin de status git
  1. Use dados estruturados — O Nushell brilha quando você trabalha com tabelas e registros em vez de strings brutas. Encadeie comandos com select, where e sort-by em vez de grep e awk.

  2. Tipage os parâmetros das funções — Adicione anotações de tipo aos comandos personalizados (name: string, count: int) para detectar erros cedo e habilitar melhor autocompletar.

  3. Prefira variáveis imutáveis — Use let por padrão e use mut apenas quando realmente precisar de mutação. Isso evita mudanças acidentais de estado em scripts.

  4. Use histórico SQLite — Defina $env.config.history.file_format = "sqlite" para buscas mais rápidas, melhor resistência a corrupção e metadados mais ricos.

  5. Aproveite par-each para desempenho — Ao processar muitos itens independentemente, par-each executa em threads paralelas e pode ser significativamente mais rápido que each.

  6. Use módulos para código reutilizável — Organize comandos personalizados em arquivos de módulo .nu e use use em vez de source. Módulos têm namespacing e exportações adequados.

  7. Use into para conversões de tipo — Sempre use conversão explícita de tipo (into int, into string, etc.) em vez de depender de coerção implícita para scripts confiáveis.

  8. Configure completações — Ative completações externas e carapace para suporte de autocompletar em todas as ferramentas CLI.

  9. Use interpolação de strings — Prefira $"Hello, ($name)!" em vez de concatenação de strings com + para código mais limpo e legível.

  10. Trate erros com try/catch — Envolva operações que podem falhar (acesso a arquivos, HTTP, análise) em blocos try { } catch { } para scripts robustos.

  11. Teste com describe — Use expression | describe para inspecionar o tipo de qualquer valor durante o desenvolvimento e depuração.

  12. Use closures consistentemente — Closures do Nushell usam a sintaxe { |params| body }. Sempre inclua os caracteres pipe mesmo para parâmetros únicos para maior clareza.