Che cos'è il comando "chiamante"?


Risposte:


16

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.


3
Eccezionale. Non solo ho imparato cosa fa quel comando, ho anche imparato il comando "type". Grazie :)

2
TIL bash ha un helpcomando
integrato

Che ho potuto votare due volte per insegnare non solo la risposta ma anche il processo.
dmckee --- ex gattino moderatore

@Muu, @nibot, @dmckee: anche type type, type help, help typee help helppotrebbe essere divertente per eseguire :)
enzotib

10

Il callercomando 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 diefunzione 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.


2

È un comando incorporato della shell: man bash(Quindi cerca 'chiamante')
Può essere usato per stampare una traccia dello stack.


Grazie anche se ho scelto la risposta di enzotib mentre mi insegnava anche il "tipo". Molte grazie però :)

0

Si noti che è possibile readl'output di callerin 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.