「発信者」コマンドは何ですか?

「発信者」コマンドは何ですか?

私は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その後、「呼び出し元」を検索してください)。

関連情報