web-dev-qa-db-ja.com

「caller」コマンドとは何ですか?

私はUbuntu 10.10を実行しています。今日、callerというコマンドに気づきましたが、manページがなく、入力(または--help)に応答せず、whereisはそれを見つけません。

それは何ですか?

13
user10065

走る

type caller

シェルが組み込まれていることがわかります。ランニング

help caller

その機能が表示され、bashのマニュアルページでも報告されます。簡単に

Return the context of the current subroutine call.

17
enzotib

callerはBashバージョン3.0に組み込まれた組み込みコマンド(POSIXでは指定されていません)であり、アクティブなサブルーチン呼び出しのコンテキストを返します。詳しくは Bash-Builtins をご覧ください。

構文:

caller [FRAMENUMBER]

frame numberが負でない整数として指定されている場合、現在の実行のその位置に対応する行番号、サブルーチン名、およびソースファイルが表示されます。呼び出しスタック。

パラメータがない場合、callerは、現在のサブルーチン呼び出しの行番号とソースファイル名を表示します。

以下を確認してください 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

出力:

12 f1 ./callertest.sh
13 f2 ./callertest.sh
14 f3 ./callertest.sh
16 main ./callertest.sh
*** an error occured ***

これは、適度に複雑なスクリプトのエラーを追跡するための適切なdie関数のサンプルです。

{ bash /dev/stdin; } <<<$'f(){ g; }\ng(){ h; }\nh(){ while caller $((n++)); do :; done; }\nf'

より洗練されたデバッグのために、Bashの拡張デバッグ機能が利用可能であり、呼び出し元よりも詳細な情報を提供するいくつかの特別なパラメーター(例:BASH_ARG{C,V})。 Bashdb などのツールは、Bashのより高度なデバッグ機能の使用を支援します。

11
kenorb

これはシェル組み込みコマンドです:man bash( 'caller'を検索します)
スタックトレースを出力するために使用できます。

2
tuxce

readの出力を変数にcaller変数に入れて、出力のフォーマット方法を制御できることに注意してください。

stacktrace() {
  local frame=0 LINE SUB FILE
  while read LINE SUB FILE < <(caller "$frame"); do
    echo "${SUB} @ ${FILE}:${LINE}"
    ((frame++))
  done
}

デモ:

$ 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
0
dimo414