¿Nushell es Lenguaje?
Todo lo que ejecutamos hasta ahora son comandos que generan datos estructurados y canalizamos de uno a otro para manipular esos datos. Esto no es completamente verdad pues a pesar de parecer comandos son más que eso, pues pueden actuar como instrucciones en un lenguaje de programación.
Lo que quiero decir es que podemos escribir nuestros propios comandos y reutilizarlos dentro de Nushell como funciones en un lenguaje.
Vamos a crear un comando simple que espera un valor de entrada de cuántas réplicas queremos en deploy.yaml. Una vez con el valor el archivo deploy.yaml deberá ser abierto y el valor de spec.replicas deberá ser alterado para el valor deseado y guardado en el mismo archivo. Tenemos 1 réplica solamente definida en el archivo hasta ahora.
~> def get-replicas [] {
let num_replicas = (input "¿Cuántas réplicas deseas en deploy.yaml? ") | into int
open deploy.yaml
| upsert spec.replicas $num_replicas
| save deploy.yaml --force
$num_replicas
}
~> get-replicas
¿Cuántas réplicas deseas en deploy.yaml? 22
24
~> cat deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: nginx
name: nginx
spec:
replicas: 22
selector:
matchLabels:
app: nginx
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: nginx
spec:
containers:
- image: nginx
name: nginx
resources: {}
status: {}
~>
Un shell script ejecuta todos los comandos en orden sin verificar el script primero, o sea, ejecuta los comandos en orden. Un script Nu es mucho más inteligente, avisa que existe un error antes de ejecutar.
Vamos a las pruebas.
#!/bin/bash
echo "Iniciando script Bash"
# Intenta usar una variable no definida
echo "El valor de la variable es: $VARIABLE_NO_DEFINIDA"
# Intenta acceder a un directorio que no existe
cd /directorio/que/no/existe
echo "Esta línea no será ejecutada si el directorio no existe"
Ejecutando...
~> ./script.sh
Iniciando script Bash
El valor de la variable es:
/Users/davidprata/./script.sh: line 6: cd: /directorio/que/no/existe: No such file or directory
Esta línea no será ejecutada si el directorio no existe
La prueba con el script Bash confirma el comportamiento:
- El script inició normalmente, imprimiendo "Iniciando script Bash".
- Al intentar imprimir la variable no definida, Bash simplemente imprimió una línea vacía, sin generar un error.
- Cuando intentó cambiar a un directorio inexistente, Bash generó un error, pero continuó la ejecución del script.
- La última línea fue impresa, incluso después del error del comando
cd.
Este comportamiento demuestra que Bash:
- No verifica el script anticipadamente para posibles errores.
- Ejecuta los comandos secuencialmente, independientemente de errores anteriores.
- No interrumpe la ejecución del script cuando encuentra un error a menos que sea usado
set -eque no hicimos.
El problema es que ejecutó todo y solo en el camino iba a agarrar el error.
Ahora vamos al mismo script escrito para Nushell (.nu).
#!/usr/bin/env nu
echo "Iniciando script Nushell"
# Intenta usar una variable no definida
echo $"El valor de la variable es: ($env.VARIABLE_NO_DEFINIDA)"
# Intenta acceder a un directorio que no existe
cd /directorio/que/no/existe
echo "Esta línea no será ejecutada si el directorio no existe"
Intentando ejecutar...
~> ./nuscript.nu
Error: nu::shell::column_not_found
× Cannot find column 'VARIABLE_NO_DEFINIDA'
╭─[/Users/davidprata/nuscript.nu:6:34]
5 │ # Intenta usar una variable no definida
6 │ echo $"El valor de la variable es: ($env.VARIABLE_NO_DEFINIDA)"
· ─────────────┬────────────┬
· │ ╰── value originates here
· ╰── cannot find column 'VARIABLE_NO_DEFINIDA'
7 │
╰────
~>
El script Nu ya avisó del problema antes incluso de ejecutar, o sea, ni ejecutó. Vamos a corregir e intentar nuevamente...
# definiendo la variable...
~> $env.VARIABLE_NO_DEFINIDA = "un_valor_cualquiera"
~> ./nuscript.nu
Error: nu::shell::directory_not_found
× Directory not found
╭─[/home/david/nuscript.nu:9:4]
8 │ # Intenta acceder a un directorio que no existe
9 │ cd /directorio/que/no/existe
· ────────────┬────────────
· ╰── directory not found
10 │
╰────
help: /directorio/que/no/existe does not exist
~>
Nushell no es un lenguaje con un compilador tradicional, pero hace un análisis estático bien hecho.
Para ayudar en la creación de scripts Nu en el IDE de VSCode tenemos la extensión vscode-nushell-lang.