私はUbuntu 10.10を実行しています。今日、caller
というコマンドに気づきましたが、manページがなく、入力(または--help)に応答せず、whereisはそれを見つけません。
それは何ですか?
走る
type caller
シェルが組み込まれていることがわかります。ランニング
help caller
その機能が表示され、bashのマニュアルページでも報告されます。簡単に
Return the context of the current subroutine call.
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のより高度なデバッグ機能の使用を支援します。
これはシェル組み込みコマンドです:man bash
( 'caller'を検索します)
スタックトレースを出力するために使用できます。
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