Eu tenho um script de teste que tem muitos comandos e irá gerar muitas saídas, eu uso set -x
ou set -v
e set -e
, então o script iria parar quando ocorrer um erro. No entanto, ainda é bastante difícil para mim localizar qual linha interrompeu a execução para localizar o problema. Existe um método que pode produzir o número da linha do script antes de cada linha ser executada? Ou exibir o número da linha antes da exibição do comando gerado por set -x
? Ou qualquer método que possa lidar com meu problema de localização de linha de script seria de grande ajuda. Obrigado.
89
echo
echo
é melhor evitar declarações desnecessárias .-x
deveria imprimir números de linha. Ou, talvez -nx
deve incluir números de linha. Para mim, é um daqueles momentos "WTF" ...\033[0;33m+(${BASH_SOURCE}:${LINENO}):\033[0m ${FUNCNAME[0]:+${FUNCNAME[0]}(): }'
para algumas coresNo Bash,
$LINENO
contém o número da linha onde o script está sendo executado atualmente.Se você precisa saber o número da linha onde a função foi chamada, tente
$BASH_LINENO
. Observe que essa variável é uma matriz.Por exemplo:
#!/bin/bash function log() { echo "LINENO: ${LINENO}" echo "BASH_LINENO: ${BASH_LINENO[*]}" } function foo() { log "$@" } foo "$@"
Veja aqui os detalhes das variáveis Bash.
fonte
Solução simples (mas poderosa): Coloque em
echo
volta do código que você acha que está causando o problema e movaecho
linha por linha até que as mensagens não apareçam mais na tela - porque o script parou devido a um erro anterior.Solução ainda mais poderosa: Instale
bashdb
o depurador bash e depure o script linha por linhafonte
echo
manipular coisas pode ajudar em muitos casos, mas é insuficiente quando você tenta aplicá-las em funções que têm saída significativa e analisável.echo "foo" >&2
Solução alternativa para shells sem LINENO
Em um script bastante sofisticado, não gostaria de ver todos os números de linha; em vez disso, gostaria de estar no controle da saída.
Defina uma função
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
Use-o com citações como
echo_line_no "this is a simple comment with a line number"
A saída é
16 "this is a simple comment with a line number"
se o número desta linha no arquivo de origem for 16.
Basicamente, isso responde à pergunta Como mostrar o número da linha ao executar o script bash para usuários do ash ou de outros shells sem
LINENO
.Mais alguma coisa a acrescentar?
Certo. Por que você precisa disso? Como você trabalha com isso? O que você pode fazer com isso? Esta abordagem simples é realmente suficiente ou útil? Por que você quer mexer nisso tudo?
Quer saber mais? Leia as reflexões sobre depuração
fonte