Saltar al contenido principal

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 each para transformar fila a fila.
  • Selección y expansión: select mantiene tablas, get extrae (expande) una columna a valores simples —un paralelismo útil con “expandir propiedad”.
Flujo básico en Nushell
# Nushell — pipeline de números a registros y filtrado
1..5
| each {|n| { original: $n, doubled: ($n * 2) } }
| where doubled > 5
| select original doubled
Procesa elemento a elemento y filtra por columna sin formatear a texto.

Análogo a begin/process/end en Nushell

Detalles clave

Nushell no ofrece bloques begin/process/end como primitiva del lenguaje. El patrón típico es: inicializar estado fuera del flujo, procesar con each y finalizar después del pipeline. Se logra con variables mutables y bloques, manteniendo el streaming.
Patrón begin/process/end en Nu (idiomático)
# 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)"
No hay hooks dedicados; se compone con estado y bloques.

Importante

En PowerShell, los tres bloques están integrados y coordinan el ciclo de vida del pipeline. En Nu se replica el flujo con código explícito, lo que da flexibilidad, pero no hay “evento end” automático dentro de una única función.

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.

Alineación de columnas en Nushell
# CSV con columnas 'login' y 'dept'
open newusers.csv
| rename samAccountName login
| rename Department dept
| select samAccountName Department
Igual que “encajar por nombre”: renombra para que la etapa siguiente encuentre lo que espera.

Detalles clave

Si una etapa consume una columna concreta, 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 estructura vs extraer valores
# Mantener tabla con una columna
ls | select name | first 3

# Expandir a lista de strings (análogo a “expandir propiedad”)
ls | get name | first 3
select conserva filas/columnas; get devuelve la columna como lista tipada.
Output
───┬────────────
 0 │ Cargo.toml
 1 │ README.md
 2 │ nu.nuon

Subexpresiones: “haz esto primero” en Nushell

Subexpresiones en Nu
# Pasar el resultado de una subexpresión a una opción
let mod = (open modules.txt | lines | to text)
help $mod
Igual que las paréntesis: se evalúa primero y el valor se inyecta donde se necesita.

Modos de invocación: parameter sets vs firmas en Nu

Detalles clave

PowerShell ofrece parameter sets con exclusión mutua y selección automática del modo. Nushell define firmas con flags y tipos, pero no tiene parameter sets nativos: se emula con validación manual.
Emular conjuntos de parámetros en Nu
# 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 }
    }
}
Exclusión mutua con if y error make; tipos en la firma para robustez.

Precaución

En PowerShell, la selección del conjunto es automática; en Nu recae en tu validación. Esto es una capacidad presente en PowerShell que Nu no ofrece de serie.

Interoperabilidad: estructurado ↔ texto/binario

  • Entradas estructuradas: open detecta formatos (CSV/JSON/TOML/Parquet) y devuelve tablas/objetos listos para filtrar sin parseo manual.
  • Salida: to csv, to json, save permiten materializar resultados.
  • Comandos externos: si esperan texto, convierte con to text o extrae columnas con get; si devuelven texto, vuelve a estructurar con from ….
Ciclo estructurado completo en Nu
# JSON -> estructurado -> filtrar -> CSV
open users.json
| where active == true
| select id name email
| to csv
| save active-users.csv

Qué 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 (no select).
  • Si te falta una columna “con el nombre correcto”, rename antes de la etapa que la exige.
  • Para contar/recapitular, inicializa con let mut, incrementa en each y emite al final.

Solución

Solución de referencia (Nu)
scripts/nushell/top3.nu
# Nushell: resumir 3 archivos más grandes del directorio actual
ls | where type == file
| sort-by size -r
| first 3
| select name size modified

Conclusiones

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/rename para 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.