2012-05-30 8 views

Respuesta

20

Es posible ajustar la variable PS4 para causar set -x de salida para incluir el número de línea:

PS4=':${LINENO}+' 
set -x 

Esto pondrá el número de línea antes de cada línea, ya que ejecuta:

:4+command here 
:5+other command 

Es importante tener algún carácter sigil (como un + en mis ejemplos) después de las expansiones variables en PS4, porque ese último carácter se repite para mostrar la profundidad de anidamiento. Es decir, si se llama a una función, y que la función invoca un comando, la salida de set -x lo reportará este modo:

:3+++command run within a function called from a function 
:8++command run within a function 
:19+line after the function was called 

Si hay varios archivos están involucrados en el funcionamiento de la secuencia de comandos, es posible que desee incluir la BASH_SOURCE variables en lugar de solamente LINENO (suponiendo que esto es realmente una escritura del golpe, en contraposición a /bin/sh - asegúrese de que su escritura se inicia con #!/bin/bash!):

PS4=':${BASH_SOURCE}:${LINENO}+' 
set -x 
5
#!/bin/sh -x 

reportará las líneas a medida que se ejecutan (la opción -x, para ser claros). No le dará el número de línea , pero informe la línea actual.

Un enfoque alternativo, pero más doloroso, es utilizar un manipulador de trampa, como se documentó here.

+1

y '-xv' da aún más información. – choroba

6

Bash tiene una variable especial $LINENO que hace lo que quiere.

#!/bin/bash 
echo "$LINENO" 
echo "$LINENO" 
echo "$LINENO" 

Demostración:

$ ./lineno 
2 
3 
4 
Cuestiones relacionadas