¿Es posible crear una plantilla/sobrescribir STDOUT?

¿Es posible crear una plantilla/sobrescribir STDOUT?

Estoy depurando una pila de llamadas y simplemente generando echodeclaraciones desde varios archivos. Los registros planos se están volviendo un poco difíciles de seguir, por lo que tengo curiosidad por saber cuál puede ser la mejor manera de anidar la salida.

Pensé que establecer una variable de entorno para el número de pestañas o como un espacio de prefijo/cadena de pestañas podría ser la opción más fácil si pudiera sobrecargar la secuencia STDOUT. Básicamente, sería bueno si pudiera hacer algo como STDOUT="$TABS$STDOUT"seguir apilando caracteres de tabulación al comienzo del flujo de salida.

Pero no estaba seguro de si es posible sobrescribir la transmisión. Por ejemplo, si quisiera anteponer cada línea un guión + espacio, ¿es posible?

Tal que:

echo foo
echo bar
echo foobar

Produce:

- foo
- bar
- foobar

  1. ¿Es posible crear plantillas STDOUT?
  2. ¿Cuál es el método sugerido para anidar la salida, sin tener que modificar todas las declaraciones echo/ printfen los distintos scripts que podrían llamarse?

Respuesta1

Probablemente lo más fácil de hacer, si no le importa fusionar stdout y stderr, es ejecutar con la -xbandera que hace que bash imprima cada comando a medida que se ejecuta con un prefijo como +++el de donde proviene el número de caracteres del nivel de anidamiento. Luego puede posprocesar la salida, recordando el prefijo pero suprimiendo la línea y aplicándola a cualquier línea siguiente sin prefijo, que será su eco o printf.

Por ejemplo, tomemos un pequeño script factorial myprog:

#!/bin/bash
f(){
        local i=$1
        if [[ "$i" > 1 ]]
        then        echo $((i*$(f $((i-1)))))
        else        echo $i
        fi
        echo "my debug info $i" >&2
}
echo "factorial ${1?} is $(f $1)"

ejecutándolo con

 bash -x myprog 4  |&
 awk '/^+/{ indent=$1; next }
          { print indent " " $0 }'

te dio

+++++ my debug info 1
++++ my debug info 2
+++ my debug info 3
++ my debug info 4
+ factorial 4 is 24

Por supuesto, puede obtener resultados de depuración bastante buenos con números de línea, nombres de archivos y funciones simplemente configurando PS4con -x. P.ej

PS4='+ ${BASH_SOURCE}:${LINENO}: ${FUNCNAME[0]} - [${SHLVL},${BASH_SUBSHELL}, $?]     ' 

te dio:

++ myprog:10: main - [2,1, 0]     f 4
++ myprog:3: f - [2,1, 0]     local i=4
++ myprog:4: f - [2,1, 0]     [[ 4 > 1 ]]
+++ myprog:5: f - [2,2, 0]     f 3
+++ myprog:3: f - [2,2, 0]     local i=3
+++ myprog:4: f - [2,2, 0]     [[ 3 > 1 ]]
++++ myprog:5: f - [2,3, 0]     f 2
++++ myprog:3: f - [2,3, 0]     local i=2
++++ myprog:4: f - [2,3, 0]     [[ 2 > 1 ]]
...

información relacionada