¿Cómo encuentra el número de línea en Bash donde ocurrió un error?
Ejemplo
Creo el siguiente script simple con números de línea para explicar lo que necesitamos. El script copiará archivos de
cp $file1 $file2
cp $file3 $file4
Cuando uno de los cp
comandos falla, la función saldrá con la salida 1 . Queremos agregar la capacidad a la función para imprimir también el error con el número de línea (por ejemplo, 8 o 12).
es posible?
Script de muestra
1 #!/bin/bash
2
3
4 function in_case_fail {
5 [[ $1 -ne 0 ]] && echo "fail on $2" && exit 1
6 }
7
8 cp $file1 $file2
9 in_case_fail $? "cp $file1 $file2"
10
11
12 cp $file3 $file4
13 in_case_fail $? "cp $file3 $file4"
14
set -x
y / oset -v
rastrear lo que se ha ejecutado. No es exactamente lo que pediste, pero probablemente también sea útil.Respuestas:
En lugar de usar su función, usaría este método en su lugar:
Esto funciona atrapando en ERR y luego llamando a la
failure()
función con el número de línea actual + comando bash que se ejecutó.Ejemplo
Aquí no he tomado ningún cuidado para crear los archivos,
f1
,f2
,f3
, of4
. Cuando ejecuto el script anterior:Falla, informando el número de línea más el comando que se ejecutó.
fuente
Además de
LINENO
contener el número de línea actual, existen las matricesBASH_LINENO
yFUNCNAME
(yBASH_SOURCE
) que contienen los nombres de función y los números de línea desde los que se llama.Entonces podrías hacer algo como esto:
Ejecutando eso imprimiría
Si usa
set -e
, otrap ... ERR
para detectar errores automáticamente, tenga en cuenta que tienen algunas advertencias. También es más difícil incluir una descripción de lo que estaba haciendo el script en ese momento (como lo hizo en su ejemplo), aunque eso podría ser más útil para un usuario normal que solo el número de línea.Vea, por ejemplo, estos para los problemas con
set -e
y otros:fuente
Bash tiene una variable incorporada
$LINENO
que se reemplaza por el número de línea actual cuando está en una declaración, por lo que puede hacerTambién puede intentar usar
trap ... ERR
qué se ejecuta cuando falla un comando (si el resultado no se prueba). P.ej:Luego, si un comando como
cp $file1 $file2
falla, recibirá el mensaje de error con el número de línea y una salida. También encontrará el comando por error en variable$BASH_COMMAND
(aunque no en ninguna redirección, etc.).fuente