O que é o comando "chamador"?

12

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?

Gilles 'SO- parar de ser mau'
fonte

Respostas:

16

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.

enzotib
fonte
3
Impressionante. Não apenas aprendi o que esse comando faz, como também aprendi o comando "type". Obrigado :)
2
TIL bash tem um helpcomando
embutido
O que eu poderia votar duas vezes por ensinar não apenas a resposta, mas também o processo.
dmckee --- gatinho ex-moderador
@Muu, @nibot, @dmckee: também type type, type help, help typee help helppoderia ser divertido para executar :)
enzotib
10

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.

kenorb
fonte
2

É um comando interno do shell: man bash(Em seguida, procure por 'chamador').
Ele pode ser usado para imprimir um rastreamento de pilha.

smoking
fonte
Obrigado, apesar de ter escolhido a resposta do enzotib, pois ele também me ensinou 'tipo'. Muito obrigado embora :)