Estou executando o Ubuntu 10.10 com o openbox executando no topo. Hoje notei um comando chamado caller, no entanto, não há página de manual, ele não responde a nenhuma entrada (ou --help) e onde não o encontra.
Você tem ideia do que seja isso?
Estou executando o Ubuntu 10.10 com o openbox executando no topo. Hoje notei um comando chamado caller, no entanto, não há página de manual, ele não responde a nenhuma entrada (ou --help) e onde não o encontra.
Você tem ideia do que seja isso?
Respostas:
Corre
type caller
e você verá que é um shell embutido. Corrida
help caller
mostrará sua função, relatada também na página de manual do bash. Resumidamente
Return the context of the current subroutine call.
helpcomando
type type, type help, help typee help helppoderia ser divertido para executar :)
O callercomando is builtin (não especificado pelo POSIX) apareceu no Bash versão 3.0 e retorna o contexto de qualquer chamada de sub-rotina ativa. Veja: Bash-Builtins para mais leitura.
Sintaxe:
caller [FRAMENUMBER]
Se o número do quadro for fornecido como um número inteiro não negativo, ele exibirá o número da linha, o nome da sub-rotina e o arquivo de origem correspondente a essa posição na pilha de chamadas de execução atual.
Sem nenhum parâmetro, o chamador exibe o número da linha e o nome do arquivo de origem da chamada de sub-rotina atual.
Verifique o seguinte rastreamento de pilha simples no Bash Hackers Wiki :
#!/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
Resultado:
12 f1 ./callertest.sh
13 f2 ./callertest.sh
14 f3 ./callertest.sh
16 main ./callertest.sh
*** an error occured ***
Aqui está um exemplo de uma diefunção decente para rastrear erros em scripts moderadamente complexos:
{ bash /dev/stdin; } <<<$'f(){ g; }\ng(){ h; }\nh(){ while caller $((n++)); do :; done; }\nf'
Para depuração mais sofisticada, os recursos de depuração estendida do Bash estão disponíveis e vários parâmetros especiais que fornecem mais detalhes do que o chamador (por exemplo
BASH_ARG{C,V}). Ferramentas como o Bashdb podem ajudar no uso de alguns dos recursos de depuração mais avançados do Bash.