Pular para o conteúdo principal

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:

  1. O script iniciou normalmente, imprimindo “Iniciando script Bash”.
  2. Ao tentar imprimir a variável não definida, o Bash simplesmente imprimiu uma linha vazia, sem gerar um erro.
  3. Quando tentou mudar para um diretório inexistente, o Bash gerou um erro, mas continuou a execução do script.
  4. A última linha foi impressa, mesmo após o erro do comando cd.

Este comportamento demonstra que o Bash:

  1. Não verifica o script antecipadamente para possíveis erros.
  2. Executa os comandos sequencialmente, independentemente de erros anteriores.
  3. Não interrompe a execução do script quando encontra um erro a menos que seja usado set -e que 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
6echo $"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
9cd /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.