Nushell é Linguagem?
Tudo o que executamos até agora são comandos que geram dados estruturados e canalizamos de um para outro para manipular esses dados. Isso não é completamente verdade pois apesar de parecerem comandos eles são mais do que isso, pois podem atuar como instruções em uma linguagem de programação.
O que quero dizer é que podemos escrever nossos próprios comandos e reutilizá-los dentro do Nushell como funções em uma linguagem.
Vamos criar um comando simples que espera um valor de entrada de quantas replicas queremos no deploy.yaml. Uma vez com o valor o arquivo deploy.yaml deverá ser aberto e o valor de spec.replicas deverá ser alterado para o valor desejado e salvado no mesmo arquivo. Temos uma 1 replica somente definida no arquivo até agora.
~> def get-replicas [] {
let num_replicas = (input "Quantas réplicas deseja no deploy.yaml? ") | into int
open deploy.yaml
| upsert spec.replicas $num_replicas
| save deploy.yaml --force
$num_replicas
}
~> get-replicas
Quantas réplicas deseja no 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: {}
~>
Um shell script executa todos os comandos em ordem sem verificar o script primeiro, ou seja, executa os comando em ordem. Um Nu script é muito mais esperto, ele avisa que existe um erro antes de executar.
Vamos as provas.
#!/bin/bash
echo "Iniciando script Bash"
# Tenta usar uma variável não definida
echo "O valor da variável é: $VARIAVEL_NAO_DEFINIDA"
# Tenta acessar um diretório que não existe
cd /diretorio/que/nao/existe
echo "Esta linha não será executada se o diretório não existir"
Executando...
~> ./script.sh
Iniciando script Bash
O valor da variável é:
/Users/davidprata/./script.sh: line 6: cd: /diretorio/que/nao/existe: No such file or directory
Esta linha não será executada se o diretório não existir
O teste com o script Bash confirma o comportamento:
- O script iniciou normalmente, imprimindo “Iniciando script Bash”.
- Ao tentar imprimir a variável não definida, o Bash simplesmente imprimiu uma linha vazia, sem gerar um erro.
- Quando tentou mudar para um diretório inexistente, o Bash gerou um erro, mas continuou a execução do script.
- A última linha foi impressa, mesmo após o erro do comando
cd.
Este comportamento demonstra que o Bash:
- Não verifica o script antecipadamente para possíveis erros.
- Executa os comandos sequencialmente, independentemente de erros anteriores.
- Não interrompe a execução do script quando encontra um erro a menos que seja usado
set -eque não fizemos.
O problema é que ele executou tudo e só no caminho iria pegar o erro.
Agora vamos ao mesmos script escrito para Nushell (.nu).
#!/usr/bin/env nu
echo "Iniciando script Nushell"
# Tenta usar uma variável não definida
echo $"O valor da variável é: ($env.VARIAVEL_NAO_DEFINIDA)"
# Tenta acessar um diretório que não existe
cd /diretorio/que/nao/existe
echo "Esta linha não será executada se o diretório não existir"
Tentando executando...
~> ./nuscript.nu
Error: nu::shell::column_not_found
× Cannot find column 'VARIAVEL_NAO_DEFINIDA'
╭─[/Users/davidprata/nuscript.nu:6:34]
5 │ # Tenta usar uma variável não definida
6 │ echo $"O valor da variável é: ($env.VARIAVEL_NAO_DEFINIDA)"
· ─────────────┬────────────┬
· │ ╰── value originates here
· ╰── cannot find column 'VARIAVEL_NAO_DEFINIDA'
7 │
╰────
~>
O Nu Script já avisou do problema antes mesmo de executar, ou seja, nem executou. Vamos corrigir e tentar novamente...
# definindo a variável...
~> $env.VARIAVEL_NAO_DEFINIDA = "um_valor_qualquer"
~> ./nuscript.nu
Error: nu::shell::directory_not_found
× Directory not found
╭─[/home/david/nuscript.nu:9:4]
8 │ # Tenta acessar um diretório que não existe
9 │ cd /diretorio/que/nao/existe
· ────────────┬────────────
· ╰── directory not found
10 │
╰────
help: /diretorio/que/nao/existe does not exist
~>
O Nushell não é uma linguagem com um compilador tradicional, mas faz uma analise estática bem feita.
Para ajudar na criação de Nu scripts na IDE do VSCode temos a extensão vscode-nushell-lang.