Quando si utilizza il chiamante incorporato in una funzione Bash trap, il risultato di caller 0
fornisce il numero di riga errato, dando sempre 1
. Ad esempio:Il chiamante 0 fornisce il numero di riga errato nel gestore trap
#!/bin/bash
function foo {
exit 1
}
function bar {
foo
}
function err {
((i = 0))
while caller $i; do
((++i))
done
}
trap err EXIT
bar
pronunciato la seguente output:
1 foo ./test.sh
6 bar ./test.sh
15 main ./test.sh
Mentre l'output per i > 0
è corretta, quando si utilizza caller 0
in un gestore trappola sembra sempre dare 1
come il numero di riga. C'è un modo per ottenere il numero di linea reale della funzione fallita da un gestore trap?
L'array 'BASH_LINENO' è tuo amico. (Quindi sono 'FUNCNAME' e' BASH_SOURCE'). –
@CharlesDuffy Sfortunatamente 'BASH_LINENO' dà semplicemente la stessa cosa di' caller 0': '1' – Xenopathic
... e quindi' trap'e err "$ LINENO" '', per quella questione. Francamente, non ho mai visto le trappole EXIT utilizzate in questo modo - probabilmente stai colpendo comportamenti che nessuno si è mai preso la briga di testare. Usare una trappola ERR sarebbe molto meno insolito. –