Como você encontra o número da linha no Bash onde ocorreu um erro?
Exemplo
Crio o seguinte script simples com números de linha para explicar o que precisamos. O script copiará arquivos de
cp $file1 $file2
cp $file3 $file4
Quando um dos cp
comandos falha, a função sai com a saída 1 . Queremos adicionar a capacidade da função de também imprimir o erro com o número da linha (por exemplo, 8 ou 12).
Isso é possível?
Script de amostra
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
e / ouset -v
rastrear o que foi executado. Não é exatamente o que você pediu, mas provavelmente será útil também.Respostas:
Em vez de usar sua função, eu usaria este método:
Isso funciona interceptando o erro e, em seguida, chamando a
failure()
função com o número da linha atual + comando bash que foi executado.Exemplo
Aqui eu não tenho tido todo o cuidado para criar os arquivos,
f1
,f2
,f3
, ouf4
. Quando executo o script acima:Falha, relatando o número da linha mais o comando que foi executado.
fonte
Além de
LINENO
conter o número da linha atual, existem as matrizesBASH_LINENO
eFUNCNAME
(eBASH_SOURCE
) que contêm os nomes das funções e os números de linha dos quais são chamados.Então você poderia fazer algo assim:
Execução que imprimiria
Se você usar
set -e
outrap ... ERR
detectar automaticamente erros, observe que eles têm algumas ressalvas. Também é mais difícil incluir uma descrição do que o script estava fazendo no momento (como você fez no seu exemplo), embora isso possa ser mais útil para um usuário comum do que apenas o número da linha.Veja, por exemplo, estes para os problemas com
set -e
e outros:fonte
O Bash possui uma variável interna
$LINENO
que é substituída pelo número da linha atual quando em uma instrução, para que você possa fazerVocê também pode tentar usar o
trap ... ERR
que é executado quando um comando falha (se o resultado não for testado). Por exemplo:Então, se um comando como
cp $file1 $file2
falhar, você receberá a mensagem de erro com o número da linha e uma saída. Você também encontrará o comando com erro na variável$BASH_COMMAND
(embora não haja redirecionamentos, etc.).fonte