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.
help
comando
type type
, type help
, help type
e help help
poderia ser divertido para executar :)
O caller
comando 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 die
funçã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.