2011-09-14 10 views
7

Si me quedobash: opción de depuración y las funciones

bash -x myscript.sh 

voy a conseguir la salida de depuración.

Pero si tengo una función en myscript.sh, el código en la función es inmune a la opción -x. Escribe para mostrar solo el nombre de la función.

¿Cómo obtener la salida de depuración para funciones en scripts bash?

Actualización:

Tras la respuesta del ztank1013, me he dado cuenta de que he usado ksh, no bash. Parece que bash tiene por defecto la opción functrace habilitada en mi sistema (gracias a bash-o-logist)

Estoy satisfecho, pero para la comunidad mantengo la pregunta abierta para ksh.

Para guión:

#!/bin/ksh 

a=2 
testering(){ 
     a=3 
     if [ $a -eq 3 ]; then 
       echo lili 
     fi 
} 
if [ $a -eq 2 ]; then 
     echo mimi 
fi 

testering 
exit 

salida del ksh -x ./testdebug.sh es:

+ a=2 
+ [ 2 -eq 2 ] 
+ echo mimi 
mimi 
+ testering 
lili 
+ exit 

Así, por ksh, ¿cuál es el truco?

(Si no hay respuesta vendrá, la 'correcta' irá a golpear-o-logist.)

+0

buena pregunta, +1 – nsd

Respuesta

8

con bash , puede utilizar functrace opción en el script

set -o functrace 

Ver página del manual de bash para otras opciones de depuración.

4

No puedo reproducir el problema, de hecho, dado mi script de prueba (debug.sh):

[root ~]# cat debug.sh 
#!/bin/bash 
fun01() { 
echo "BUT HERE I am inside the function fun01() body" 
} 
echo "HERE I am outside the function fun01() body!" 
sleep 2 
fun01 
exit 

lo funciono con la opción de depuración parado:

[root ~]# ./debug.sh 
HERE I am outside the function fun01() body! 
BUT HERE I am inside the function fun01() body 

y encendido (bash -x ...):

[root ~]# bash -x ./debug.sh 
+ echo 'HERE I am outside the function fun01() body!' 
HERE I am outside the function fun01() body! 
+ sleep 2 
+ fun01 
+ echo 'BUT HERE I am inside the function fun01() body' 
BUT HERE I am inside the function fun01() body 
+ exit 

Por lo que puedo ver, la línea ejecutada dentro de la función fun01() se muestra con un inicio + que es el depurador en acción.

@ bash-o-logist Incluso si añado variable o si las construcciones/then/else condicional todavía obtener toda la información de depuración:

[[email protected] ~]# cat debug-new.sh 
#!/bin/bash 
fun01() { 
INSIDEVAR='Never really use this one' 
echo "BUT HERE I am inside the function fun01() body" 
if [ true ] ; then echo 'this is going to be printed always!' ; fi 
} 
echo "HERE I am outside the function fun01() body!" 
sleep 2 
fun01 
exit 

Ejecución de nuevo:

[[email protected] ~]# bash -x debug-new.sh 
+ echo 'HERE I am outside the function fun01() body!' 
HERE I am outside the function fun01() body! 
+ sleep 2 
+ fun01 
+ INSIDEVAR='Never really use this one' 
+ echo 'BUT HERE I am inside the function fun01() body' 
BUT HERE I am inside the function fun01() body 
+ '[' true ']' 
+ echo 'this is going to be printed always!' 
this is going to be printed always! 
+ exit 
+1

no puedes simplemente hacer eco de algunas afirmaciones dentro de las funciones. Intenta declarar variables y usar if/else dentro de las funciones. –

+0

+1 por ayudarme –

2

En uso ksh typeset -ft function-name para trazar en una función

+0

cómo usar este comando? Intenté en script, afuera, pero sin éxito ... –

+0

@FlorinGhita dentro del script, reemplazando * 'function-name' * con el nombre de la función que se está depurando. – yarek

0

tuve pregunta similar y terminó en escribir mi propia Debbuger de Bash. ¡Intentalo! ...Espero que te ayude https://sourceforge.net/projects/bashdebugingbash/

+0

Publica tu código aquí, no un enlace a tu código. –

+0

pantalla parece prometedor, pero no funciona '' ' 1/usr/share/bdb $ pwd /usr/share/bdb 1/usr/share/bdb $ ./bdb.sh + para bdbINC en inc/bdb.lang inc/bdb.vars inc/bdb.lib + INCFICH =/usr/share/bdb/inc/bdb.lang + componer -u INCUPR = inc/bdblang + INCFLAG = INC/BDBLANG_INCLUDE ./bdb .sh: línea 29: INC/BDBLANG_INCLUDE: mala sustitución + exit '' ' y mi español es demasiado pésimo para entender tu código –

Cuestiones relacionadas