[OT] Salida de los comandos en forma de objeto
Hola, estaba yo divagando un rato...
En vista de las respuestas obtenidas en mi correo sobre "cómo obtener la carga
de la CPU" he comprobado algo que todos ya sabemos: que en la mayoría de
ocasiones si queremos obtener datos concretos de forma automatizada debemos
ejecutar el comando correspondiente y parsear la salida de pantalla para
recortar el campo que nos interesa y demás.
Siempre me ha gustado mucho el concepto de "separación de formato y
contenido", cosa que se hace en la web (CSS y HTML) pero en absoluto en la
consola Linux. Y me da un poco de miedo, pongo un ejemplo:
Imaginemos que un programa monitoriza la swap usada, para ello tendrá que
llamar internamente al comando "free" que da un resultado:
# free -m
total used free shared buffers cached
Mem: 1011 992 19 0 140 493
-/+ buffers/cache: 358 652
Swap: 698 137 560
y añadir tuberías para hacer primero un "grep Swap" y luego un cut/sed/awk
para quedarse con el segundo campo numérico.
Tengamos en cuenta en este punto que la salida de "free" (y de tantos otros
comandos) está formateada para ser visualmente "atractiva", en absoluto está
pensada para ser procesada/parseada, luego hace falta la colección de amigos
de Bash de antes (grep, cut...) para obtener el dato que nos interesa.
¿Y qué pasa si de repente el autor de "free" decide cambiar mínimamente el
ASPECTO de la salida de "free"? ¿Y si cambia el orden de las columnas en base
a un estudio de usabilidad o lo que sea? Miedo me da la cantidad de programas
que parsean la salida de "free" y que dejarían de funcionar con la nueva
versión de "free", total, "por un simple cambio de formato VISUAL!!!".
A todo esto, me viene a la mente un concepto que escuché sobre una supuesta
nueva consola de Microsoft, que ni sé si se ha hecho realidad ni me importa,
pero la idea era interesante:
La salida de los comandos se refleja en un objeto con atributos
correspondientes a los distintos campos que se muestran (o incluso otros).
Pongo un ejemplo:
El comando "free" da una salida VISUAL así:
# free -m
total used free shared buffers cached
Mem: 1011 992 19 0 140 493
-/+ buffers/cache: 358 652
Swap: 698 137 560
Imaginemos que un programa necesita conocer la swap usada. Con la salida en
forma de objeto (que podría ser una variable/objeto llamada "out") sería tan
sencillo como:
$out.swap.used
Es decir, cada comando definiría su propio API de atributos que genera, que
serían descritos en el "man" o "--help". El programador podría entonces
decidir cambiar drásticamente el aspecto mediocre de la salida del comando y
no pasaría nada pues el objeto $out seguiría siendo igual.
En Linux veo dos problemas grandes:
- La ensalada y anarquía en cuanto a ficheros de configuración, obligando a
los desarrolladores de otras aplicaciones a hacer auténticas peripecias
parseando otros ficheros paridos cada uno por su madre.
- El problema que describo, en el que la salida visual interfiere
completamente con la salida "computacional" en los comandos básicos.
En fin, ¿qué opináis? ¿sería positivo esta salida de comandos en forma de
objeto? ¿o es una tontería?
Saludos.
--
Iñaki Baz Castillo
Reply to: