Tengo un script de prueba que tiene muchos comandos y generará muchos resultados, uso set -x
o set -v
y set -e
, por lo que el script se detendría cuando se produjera un error. Sin embargo, todavía me resulta bastante difícil localizar en qué línea se detuvo la ejecución para localizar el problema. ¿Existe un método que pueda generar el número de línea del script antes de que se ejecute cada línea? ¿O mostrar el número de línea antes de la exhibición de comandos generada por set -x
? O cualquier método que pueda resolver mi problema de ubicación de línea de script sería de gran ayuda. Gracias.
89
echo
echo
es mejor evitar declaraciones innecesarias .-x
debería imprimir números de línea. O, tal vez,nx
debería incluir números de línea. Para mí, es uno de esos momentos "WTF" ...\033[0;33m+(${BASH_SOURCE}:${LINENO}):\033[0m ${FUNCNAME[0]:+${FUNCNAME[0]}(): }'
para algunos coloresEn Bash,
$LINENO
contiene el número de línea donde se ejecuta actualmente el script.Si necesita saber el número de línea donde se llamó a la función, intente
$BASH_LINENO
. Tenga en cuenta que esta variable es una matriz.Por ejemplo:
#!/bin/bash function log() { echo "LINENO: ${LINENO}" echo "BASH_LINENO: ${BASH_LINENO[*]}" } function foo() { log "$@" } foo "$@"
Consulte aquí los detalles de las variables Bash.
fuente
Solución simple (pero poderosa): coloque
echo
alrededor del código que cree que causa el problema y muevaecho
línea por línea hasta que los mensajes ya no aparezcan en la pantalla, porque el script se ha detenido debido a un error antes.Solución aún más poderosa: instale
bashdb
el depurador de bash y depure el script línea por líneafuente
echo
Hacer cosas alrededor puede ayudar en muchos casos, pero se queda corto cuando intenta aplicarlo en funciones que tienen una salida significativa y analizable.echo "foo" >&2
Solución alternativa para proyectiles sin LINENO
En una secuencia de comandos bastante sofisticada, no me gustaría ver todos los números de línea; más bien me gustaría tener el control de la salida.
Definir una función
echo_line_no () { grep -n "$1" $0 | sed "s/echo_line_no//" # grep the line(s) containing input $1 with line numbers # replace the function name with nothing } # echo_line_no
Úselo con comillas como
echo_line_no "this is a simple comment with a line number"
La salida es
16 "this is a simple comment with a line number"
si el número de esta línea en el archivo fuente es 16.
Básicamente, esto responde a la pregunta Cómo mostrar el número de línea al ejecutar un script bash para usuarios de ash u otros shells sin
LINENO
.¿Algo más que agregar?
Por supuesto. ¿Por qué necesitas esto? ¿Cómo trabajas con esto? ¿Qué puedes hacer con esto? ¿Es este sencillo enfoque realmente suficiente o útil? ¿Por qué quieres jugar con esto?
¿Quiere saber más? Leer reflexiones sobre la depuración
fuente