[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

[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: