Un shell moderno que trata todo como datos estructurados en lugar de texto sin formato. Las tuberías funcionan con tablas, registros y listas — no solo cadenas. Piensa en él como un shell que entiende JSON, CSV, TOML y YAML de forma nativa.
| 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 (o descargar desde GitHub releases) |
| Arch Linux | sudo pacman -S nushell |
| Fedora/RHEL | sudo dnf install nushell |
| Cargo (Todas las plataformas) | cargo install nu |
| Nix | nix-env -iA nixpkgs.nushell |
Lanzar: Ejecutar nu desde cualquier shell para iniciar Nushell. Establecer como shell predeterminado: chsh -s $(which nu)
Las tuberías de Nushell pasan datos estructurados (tablas, registros, listas), no texto:
# Traditional shell: text → grep → awk → text
# Nushell: table → where → select → table
ls | where size > 1mb | sort-by size --reverse | first 5
Tipos de datos: cadenas, enteros, flotantes, booleanos, fechas, duraciones, tamaños de archivo, listas, registros, tablas
| Comando | Descripción |
|---|
ls | Listar directorio como tabla estructurada |
ls -la | Listar todos los archivos (incluyendo ocultos) en formato largo |
cd path/to/dir | Cambiar directorio |
cp source dest | Copiar archivos o directorios |
mv source dest | Mover o renombrar archivos |
rm file | Eliminar archivos |
mkdir dirname | Crear directorio |
open file.json | Abrir archivo como datos estructurados (auto-detecta formato) |
open file.csv | Abrir CSV como tabla |
open file.toml | Abrir TOML como registro |
save output.json | Guardar salida de tubería a archivo |
cat file.txt | Mostrar contenido de archivo como texto |
ps | Mostrar procesos en ejecución como tabla |
sys | Mostrar información del sistema |
which command | Encontrar ubicación de comando |
help commands | Listar todos los comandos disponibles |
help <command> | Mostrar ayuda para un comando específico |
| Comando | Descripción |
|---|
ls | where size > 10mb | Filtrar archivos mayores a 10 MB |
ls | where name =~ "\.rs$" | Filtrar por regex en nombre de archivo |
ls | where type == "dir" | Mostrar solo directorios |
ls | where modified > 2day | Archivos modificados en los últimos 2 días |
ls | select name size | Mostrar solo columnas de nombre y tamaño |
ls | reject type | Eliminar la columna de tipo |
ls | get name | Extraer solo la columna de nombre como lista |
ls | first 5 | Mostrar primeras 5 entradas |
ls | last 3 | Mostrar últimas 3 entradas |
ls | skip 10 | Saltar primeras 10 entradas |
ls | nth 0 2 4 | Seleccionar entradas por índice |
ls | length | Contar número de entradas |
ls | uniq | Eliminar entradas duplicadas |
| Comando | Descripción |
|---|
ls | sort-by size | Ordenar por tamaño ascendente |
ls | sort-by size --reverse | Ordenar por tamaño descendente |
ls | sort-by name | Ordenar alfabéticamente |
ls | group-by type | Agrupar entradas por tipo |
ls | group-by {get name | path parse | get extension} | Agrupar por extensión de archivo |
| Comando | Descripción |
|---|
"hello world" | str upcase | Convertir a mayúsculas |
"HELLO" | str downcase | Convertir a minúsculas |
" hello " | str trim | Recortar espacios en blanco |
"hello" | str contains "ell" | Verificar si cadena contiene subcadena |
"hello" | str replace "l" "L" | Reemplazar caracteres |
"hello world" | split row " " | Dividir cadena en lista |
["hello" "world"] | str join ", " | Unir lista en cadena |
"hello" | str length | Obtener longitud de cadena |
"hello" | str starts-with "he" | Verificar prefijo de cadena |
| Comando | Descripción |
|---|
open data.json | get field_name | Acceder a un campo en JSON |
open data.json | get nested.field | Acceder a campos anidados |
{name: "Alice", age: 30} | Crear un registro |
[1 2 3 4 5] | Crear una lista |
[[name age]; [Alice 30] [Bob 25]] | Crear una tabla |
$data | to json | Convertir a JSON |
$data | to csv | Convertir a CSV |
$data | to toml | Convertir a TOML |
$data | to yaml | Convertir a YAML |
$data | to md | Convertir a tabla Markdown |
| Comando | Descripción |
|---|
[1 2 3 4] | math sum | Suma de valores |
[1 2 3 4] | math avg | Promedio 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 | Tamaño total de archivos listados |
1 + 2 | Aritmética básica |
10 / 3 | División |
2 ** 8 | Exponenciación |
| Comando | Descripción |
|---|
http get https://api.example.com/data | Obtener URL y analizar respuesta |
http post https://api.example.com/data {key: "value"} | Solicitud POST con cuerpo |
fetch url | get field | Obtener y extraer campo específico |
# Variables (immutable by default)
let name = "Alice"
let count = 42
let files = (ls | where size > 1mb)
# Mutable variables
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 }
# Custom commands (functions)
def greet [name: string] { $"Hello, ($name)!" }
greet "World"
| Archivo | Propósito |
|---|
$nu.config-path | Configuración principal (config.nu) |
$nu.env-path | Configuración de entorno (env.nu) |
# Show config file location
$nu.config-path
# Edit config
config nu # Open config.nu in editor
config env # Open env.nu in editor
# In config.nu
$env.config = {
show_banner: false # Disable welcome banner
table: {
mode: rounded # Table style: rounded, compact, thin, none
}
completions: {
algorithm: "fuzzy" # Fuzzy tab completion
}
history: {
max_size: 10000 # History entries to keep
file_format: "sqlite" # sqlite or plaintext
}
}
# Find largest files in a project
ls **/* | where type == "file" | sort-by size --reverse | first 20
# Parse and query JSON API
http get https://api.github.com/repos/nushell/nushell | select stargazers_count forks_count
# Convert between formats
open data.csv | to json | save data.json
# Analyze log files
open access.log | lines | parse "{ip} - - [{date}] \"{method} {path} {proto}\" {status} {size}"
| where status == "404" | group-by path | sort-by -r
# Quick system overview
sys | get host
ps | sort-by cpu --reverse | first 10
| Característica | Bash/Zsh | Nushell |
|---|
| Modelo de datos | Flujos de texto | Tablas estructuradas |
| Análisis de salida | grep, awk, sed | where, select, get integrados |
| Manejo de JSON | Requiere jq | Nativo (open file.json) |
| Manejo de errores | Códigos de salida | Mensajes de error enriquecidos |
| Completado con tabulador | Básico | Consciente del contexto |
| Sistema de tipos | Ninguno | Enteros, cadenas, fechas, tamaños, etc. |
| Curva de aprendizaje | Familiar | Nueva sintaxis a aprender |
| Comandos externos | Nativo | Totalmente compatible |