私はopenboxが実行されているUbuntu 10.10を実行しています。今日発見したのは、というコマンドがありますが、caller
マニュアルページもなく、どの入力(または--help)にも応答せず、whereisでこれを見つけることができないということです。
それが何であるかを知っていますか?
答え1
走る
type caller
組み込みシェルであることがわかります。走る
help caller
これらの機能はbashのマニュアルページに表示され、報告されます。単に
Return the context of the current subroutine call.
答え2
Bashバージョン3.0で導入された組み込みコマンド(POSIX未指定)は、caller
アクティブなサブルーチン呼び出しのコンテキストを返します。望むより:バッシュ内蔵もっと読むには。
通事論:
caller [FRAMENUMBER]
もしフレーム非負の整数として提供され、現在の実行呼び出しスタック内の対応する場所に対応する行番号、サブルーチン名、およびソースファイルを表示します。
パラメータなし訪問者現在のサブルーチン呼び出しの行番号とソースファイル名を表示します。
以下を確認してください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_ARG{C,V}
Bash拡張デバッグ機能を使用できます。次のツールバッシュデータベースBashの高度なデバッグ機能のいくつかを使用するのに役立ちます。
答え3
出力形式を制御するために、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
答え4
これはスタックトレースを印刷するために使用できるシェル組み込みです。 (man bash
その後、「呼び出し元」を検索してください)。