Ubuntu上でopenboxを実行してUbuntu 10.10を実行しています。私は今日、というコマンドに気付きましたcaller
が、manページはなく、入力(または--help)に応答せず、whereisはそれを見つけません。
それは何ですか?
Ubuntu上でopenboxを実行してUbuntu 10.10を実行しています。私は今日、というコマンドに気付きましたcaller
が、manページはなく、入力(または--help)に応答せず、whereisはそれを見つけません。
それは何ですか?
回答:
走る
type caller
シェルが組み込まれていることがわかります。ランニング
help caller
bashのマニュアルページにも報告されている機能が表示されます。簡単に
Return the context of the current subroutine call.
help
コマンドがあります
type type
、type help
、help type
およびhelp help
実行するために楽しいことができ:)
caller
Bashのバージョン3.0に現れ、それがアクティブなサブルーチン呼び出しのコンテキストを返す(POSIXによって指定されていない)組み込みコマンドです。詳細については、Bash-Builtinsを参照してください。
構文:
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の拡張デバッグ機能と、呼び出し元より詳細な情報を提供する特別なパラメーター(例
BASH_ARG{C,V}
)を利用できます。Bashdbなどのツールは、Bashのより高度なデバッグ機能の使用を支援できます。