Presentamos ABS, un lenguaje de programación para scripts de shell

Durante los últimos días, me tomé un tiempo para trabajar en un proyecto que tenía en mente durante años, una alternativa de scripting a Bash: permítanme presentarles el lenguaje de programación ABS.

Por qué

Permítanme ser breve: a todos nos encanta la programación de shell: automatizar tareas repetitivas sin demasiado esfuerzo.

Probablemente estemos de acuerdo en que la programación de shell también es un poco loca en términos de sintaxis:

if [ -z $STRING ]; then ...fi

Como, ehm, ¿qué diablos? fi? -z? ¿soportes?

La lucha con Bash, o el lenguaje de programación de shell común, puede volverse intensa de vez en cuando. Escribir código como:

if (this == that) { parts = this.split("/").filter(...).map(...)}

traerá lágrimas a tus ojos si estás usando el caparazón.

Ahora, puede hacer cosas similares con cualquier lenguaje de programación convencional (el ejemplo anterior es JavasScript válido): en lo que estos lenguajes no son excelentes es en su integración con el sistema subyacente; un shell es simplemente mucho más coincidente / poderoso desde esa perspectiva.

Imagina que podrías ejecutar un código como:

host = $(hostname)
if (host == "johns_computer") { ...}

Bueno, ya no tienes que "imaginar": ABS es un lenguaje que combina comandos del sistema rápidos y simples con una sintaxis más elegante.

Piense en ello como lo mejor desde los dulces, solo para recordar que esta es la definición que le dio el autor de ABS. Pero en serio, es bastante conveniente.

¿No me crees? ¡Sigue leyendo!

Ejemplos

Soy un firme creyente en el “¡ muéstrame el código! ”Mantra, así que vamos a hacerlo rápidamente. Ejecutar comandos de shell es extremadamente fácil en ABS:

# Get the content of your hostfile$(cat /etc/hosts)

y las tuberías también funcionan:

# Check if a domain is in your hostfile$(cat /etc/hosts | grep domain.com | wc -l)

En este punto, podemos capturar la salida de nuestro comando y escribir sobre él:

# Check if a domain is in your hostfilematches = $(cat /etc/hosts | grep domain.com | wc -l)
# If so, print an awesome stringif matches.int() > 0 { echo("We got ya!")}

No sucederá, pero digamos que ocurre un error :

# Check if a domain is in your hostfilematches = $(cat /etc/hosts | grep domain.com | wc -l)
if !matches.ok { echo("How do you even...")}
# If so, print an awesome stringif matches.int() > 0 { echo("We got ya!")}

Podríamos hacer esto un poco más general:

$ cat script.abs# Usage $ abs script.abs domain.com# Check if a domain is in your hostfiledomain = arg(2)matches = $(cat /etc/hosts | grep $domain | wc -l)
if !matches.ok { echo("How do you even...")}
# If so, print an awesome stringif matches.int() > 0 { echo("We got %s!", domain)}

Ahora, las cadenas son bastante aburridas, así que podemos probar algo más divertido:

# Say we're getting some JSON from a commandx = $(echo '{"some": {"dope": "json"}}')x.json().some.dope # "json"
# Arrays, you say?tz = $(cat /etc/timezone) # "Asia/Dubai"parts = tz.split("/") # ["Asia", "Dubai"]
# You better destructure the hell out of that![continent, city] = tz.split("/")

…y así. Hay un montón de cosas "normales" que puede hacer con ABS, por lo que no me centraré mucho en ellas; permítame mostrarle las partes más extrañas:

# Avoiding the bug that happened because# we forgot to compare strings case-insensitively"HELLO" ~ "hello" # true
# Just range1..3 # [1, 2, 3]
# Combined comparison operator (thanks Ruby!)5  5 # 05  6 # -16  5 # 1
# Classic short-circuiting1 && 2 # 21 || 2 # 1

Puede hojear toda la documentación en 15 minutos: el objetivo de ABS no es ser un lenguaje de uso general cargado de funciones, por lo que la superficie no es tan amplia. Además, si ha trabajado con lenguajes como JavaScript, Python o Ruby, no tendrá problemas para acostumbrarse a ABS.

¿Qué va a pasar ahora?

Puede dirigirse al sitio web de ABS y obtener más información sobre el idioma. Los valientes, en cambio, harán un viaje al repositorio de github de ABS y descargarán una versión para instalarlo localmente.

Los más valientes simplemente:

bash <(curl //www.abs-lang.org/installer.sh)

(es posible que necesite sudo justo antes de eso)

Cual vas a ser

Publicado originalmente en odino.org (25 de diciembre de 2018).

Puedes seguirme en Twitter: ¡las peroratas son bienvenidas! ?