Sto eseguendo Ubuntu 10.10 con openbox in esecuzione in cima. Ho notato oggi un comando chiamato caller
, tuttavia non esiste una pagina man, non risponde a nessun input (o --help) e dove non lo trova.
qualche idea di cosa sia?
Sto eseguendo Ubuntu 10.10 con openbox in esecuzione in cima. Ho notato oggi un comando chiamato caller
, tuttavia non esiste una pagina man, non risponde a nessun input (o --help) e dove non lo trova.
qualche idea di cosa sia?
Risposte:
Correre
type caller
e vedrai che è una shell integrata. In esecuzione
help caller
mostrerà la sua funzione, riportata anche nella pagina del manuale di bash. Brevemente
Return the context of the current subroutine call.
help
comando
type type
, type help
, help type
e help help
potrebbe essere divertente per eseguire :)
Il caller
comando isin incorporato (non specificato da POSIX) è apparso in Bash versione 3.0 e restituisce il contesto di qualsiasi chiamata di subroutine attiva. Vedi: Bash-Builtins per ulteriori letture.
Sintassi:
caller [FRAMENUMBER]
Se il numero di frame viene fornito come numero intero non negativo, visualizza il numero di riga, il nome della subroutine e il file di origine corrispondenti a quella posizione nello stack di chiamate di esecuzione corrente.
Senza alcun parametro, il chiamante visualizza il numero di riga e il nome file di origine della chiamata di subroutine corrente.
Controlla la seguente traccia di stack semplice nel Wiki di Bash Hackers :
#!/bin/bash
die() {
local frame=0
while caller $frame; do
((frame++));
done
echo "$*"
exit 1
}
f1() { die "*** an error occured ***"; }
f2() { f1; }
f3() { f2; }
f3
Produzione:
12 f1 ./callertest.sh
13 f2 ./callertest.sh
14 f3 ./callertest.sh
16 main ./callertest.sh
*** an error occured ***
Ecco un esempio di una die
funzione decente per rintracciare gli errori in script moderatamente complessi:
{ bash /dev/stdin; } <<<$'f(){ g; }\ng(){ h; }\nh(){ while caller $((n++)); do :; done; }\nf'
Per un debug più sofisticato, sono disponibili funzionalità di debug estese di Bash e una serie di parametri speciali che forniscono più dettagli rispetto al chiamante (ad es
BASH_ARG{C,V}
.). Strumenti come Bashdb possono aiutarti a utilizzare alcune delle funzionalità di debug più avanzate di Bash.
Si noti che è possibile read
l'output di caller
in variabili, per controllare come viene formattato l'output:
stacktrace() {
local frame=0 LINE SUB FILE
while read LINE SUB FILE < <(caller "$frame"); do
echo "${SUB} @ ${FILE}:${LINE}"
((frame++))
done
}
demo:
$ cat /tmp/caller.sh
#!/bin/bash
stacktrace() {
local frame=0 LINE SUB FILE
while read LINE SUB FILE < <(caller "$frame"); do
printf ' %s @ %s:%s' "${SUB}" "${FILE}" "${LINE}"
((frame++))
done
}
die() {
echo "$*"
stacktrace
exit 1
}
f1() { die "*** an error occured ***"; }
f2() { f1; }
f3() { f2; }
f3
$ bash /tmp/caller.sh
*** an error occured ***
die @ /tmp/caller.sh:13
f1 @ /tmp/caller.sh:17
f2 @ /tmp/caller.sh:18
f3 @ /tmp/caller.sh:19
main @ /tmp/caller.sh:21