Pipeline-awareness en Nushell
Metadatos de la lección
- Autoría:
- Ignacio Slater-Muñoz
- Última actualización:
- 27 de marzo de 2026
Cambios recientes:
-
8880728· 27 de marzo de 2026 · ✨ feat(notes): add abstract slots and Python structured-output lesson ( GitLab / GitHub ) -
0b7190d· 26 de marzo de 2026 · 📚🐛 feat(scripting): add Nushell pipelines lesson and unblock checks ( GitLab / GitHub ) -
f6dd69c· 17 de febrero de 2026 · 🐛 fix(notes): resolve Astro compilation issues in Python lessons ( GitLab / GitHub )
Abstract
El pipeline en Nushell, en 3 ideas
- Datos tipados en tránsito: las etapas operan sobre registros/filas. Muchos comandos trabajan “por columna” sin parseo manual.
- Bloques por elemento: la unidad de procesamiento suele ser un record; se usa
eachpara transformar fila a fila. - Selección y expansión:
selectmantiene tablas,getextrae (expande) una columna a valores simples —un paralelismo útil con “expandir propiedad”.
# Nushell — pipeline de números a registros y filtrado
1..5
| each {|n| { original: $n, doubled: ($n * 2) } }
| where doubled > 5
| select original doubledAnálogo a begin/process/end en Nushell
Detalles clave
each y finalizar después del pipeline. Se logra con variables
mutables y bloques, manteniendo el streaming.
# Inicialización (begin)
let mut count = 0
# Proceso por elemento (process)
ls
| where type == file
| each {|f|
$count = $count + 1
{ name: $f.name, size: $f.size }
}
# Finalización (end)
print $"Procesados ($count) archivo(s)" Importante
Encaje por nombre: columnas en Nu vs parámetros en PowerShell
En PowerShell, ByPropertyName hace binding cuando el nombre de propiedad
coincide con el del parámetro. En Nu, muchos comandos operan sobre columnas de la
tabla actual; para “alinear” nombres, se usan rename/update
antes de invocar otras etapas.
# CSV con columnas 'login' y 'dept'
open newusers.csv
| rename samAccountName login
| rename Department dept
| select samAccountName Department Detalles clave
rename y select son
el equivalente a preparar el objeto para ByPropertyName. No hay parameter
binding automático entre comandos arbitrarios como en PowerShell: en Nu decides
explícitamente la forma del registro.
select (tabla) vs get (expandir)
# Mantener tabla con una columna
ls | select name | first 3
# Expandir a lista de strings (análogo a “expandir propiedad”)
ls | get name | first 3select conserva filas/columnas; get devuelve la columna
como lista tipada.
───┬────────────
0 │ Cargo.toml
1 │ README.md
2 │ nu.nuonSubexpresiones: “haz esto primero” en Nushell
# Pasar el resultado de una subexpresión a una opción
let mod = (open modules.txt | lines | to text)
help $modModos de invocación: parameter sets vs firmas en Nu
Detalles clave
# Definir un comando en Nu con dos flags excluyentes
def summarize [
--path (-p): path
--list (-l): list<path>
] {
if ($path != null and $list != null) {
error make { msg: "Usa solo --path o --list" }
}
let items = if $path != null {
ls $path | where type == file | get name
} else {
$list
}
$items
| each {|p|
let f = (ls $p | first 1)
{ name: $f.name, size: $f.size }
}
}if y error make; tipos en la firma
para robustez.
Precaución
Interoperabilidad: estructurado ↔ texto/binario
- Entradas estructuradas:
opendetecta formatos (CSV/JSON/TOML/Parquet) y devuelve tablas/objetos listos para filtrar sin parseo manual. - Salida:
to csv,to json,savepermiten materializar resultados. - Comandos externos: si esperan texto, convierte con
to texto extrae columnas conget; si devuelven texto, vuelve a estructurar confrom ….
# JSON -> estructurado -> filtrar -> CSV
open users.json
| where active == true
| select id name email
| to csv
| save active-users.csvQué puedes hacer en uno y no en el otro (o no igual)
- PowerShell → parameter binding ByValue/ByPropertyName entre cmdlets arbitrarios y parameter sets con selección automática. En Nu, el “binding” es por columnas y la exclusión mutua es manual.
- PowerShell → hooks formales begin/process/end por función. En Nu se compone con variables/bloques; no hay ganchos integrados por etapa.
- Nushell → operaciones tabulares idiomáticas sin clases/propiedades .NET: muchas tareas de ETL se expresan más concisas sobre tablas (p. ej.,
open+where+update). - Nushell → autodetección de formatos y paths de columna simplifican pipelines centrados en datos; no requiere escribir tipos o wrappers.
Ejercicio: Ejercicio: portar un flujo a Nushell
Toma un pipeline que conozcas (filtrar archivos, transformar filas de un CSV, etc.) y exprésalo en Nu. El objetivo es preservar estructura hasta el final y comparar concisión/legibilidad.
Hints
- Si necesitas “expandir propiedad”, usa
get(noselect). - Si te falta una columna “con el nombre correcto”,
renameantes de la etapa que la exige. - Para contar/recapitular, inicializa con
let mut, incrementa eneachy emite al final.
Solución
# Nushell: resumir 3 archivos más grandes del directorio actual
ls | where type == file
| sort-by size -r
| first 3
| select name size modifiedConclusiones
Ambos ecosistemas comparten la idea de composición basada en objetos, pero difieren en cómo llegan ahí: PowerShell confía en un binding rico entre parámetros y el ciclo begin/process/end; Nushell apuesta por tablas y columnas con bloques expresivos y transformación explícita.
Elegir uno u otro depende de si priorizas binding y contratos de cmdlets (PowerShell) o operaciones tabulares y datos heterogéneos con sintaxis concisa (Nushell).
Puntos clave
- Nu trabaja “por columnas”; usa
select/get/renamepara modelar el registro. - El patrón begin/process/end se emula con
let mut+each+ paso final. - No hay parameter sets nativos en Nu; valida exclusión mutua manualmente.
- Interopera con texto/binario usando
from/to/save.
¿Qué nos llevamos?
Donde PowerShell ofrece “autopistas” de binding entre cmdlets, Nushell te da una tabla en la mano para transformar datos sin perder estructura. Ambos son pipelines de objetos; elige la superficie que mejor modele tu problema.