Com a função
function fail() {
local msg="$*"
echo $msg at
for i in ${!FUNCNAME[@]}; do
echo " ${FUNCNAME[$i]} ${BASH_SOURCE[$i]}:${BASH_LINENO[$i]}"
done
exit 1
}
Recebo um bom rastreamento de pilha quando ele é chamado para sair. Seria ainda mais informativo se eu pudesse obter os parâmetros das funções na pilha de chamadas. Isso é possível?
O Bash tem os arrays
BASH_ARGC
eBASH_ARGV
para isso.BASH_ARGC
informa quantos argumentos cada função na pilha de chamadas possui eBASH_ARGV
contém os argumentos de todas as funções em ordem. Ambas exigem que essa opçãoshopt -s extdebug
esteja habilitada.Acontece que os argumentos
BASH_ARGV
estão em ordem inversa, com o argumento mais à direita da função mais interna no índice 0, como se fossem colocados em uma pilha, da esquerda para a direita, com o topo da pilha no índice 0. Bonito, mas difícil de usar, já que a linguagem shell não fornece sintaxe para lidar com uma pilha como essa, e você provavelmente desejaria o argumento mais à esquerda primeiro para impressão de qualquer maneira. (Ou seja, uma fatia de array"${BASH_ARGV[@]:n:m}"
retornaria os argumentos em ordem inversa.)Por exemplo isto:
irá imprimir
Você precisará de alguma ginástica de índice para imprimir uma saída útil, algo nessa direção:
Se
bar
as chamadas acimatrace
forem feitas em vez de imprimir, isso deve gerar um rastreamento como este: