
Estoy depurando una pila de llamadas y simplemente generando echo
declaraciones 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
- ¿Es posible crear plantillas STDOUT?
- ¿Cuál es el método sugerido para anidar la salida, sin tener que modificar todas las declaraciones
echo
/printf
en 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 -x
bandera 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 PS4
con -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 ]]
...