7

'caller'を使用して、bashで関数呼び出しのバックトレースを取得できることを知っています。

#! /bin/bash
Backtrace () {
   echo "Backtrace is:"
   i=0
   while caller $i
   do
      i=$((i+1))
   done
}
myFunc () {
   Backtrace
}
myFunc

プリント:

Backtrace is:
11 myFunc ./test.sh
13 main ./test.sh

私の質問は、チェックされていない失敗で終了するために「set-e」を使用するスクリプトがあるとしましょう。スクリプトが失敗した場所(およびその呼び出し元)の行番号を取得することは可能ですか?

私は素朴にやってみました:trap'Backtrace' EXIT、しかしそれは私に失敗したコマンドの行番号ではなく'1main./test.sh'を与えます

4

2 に答える 2

4

それが機能するかどうかはわかりませんが、 'd信号のERRリストに追加してみてください。trapたぶんあなたのコードはset -eものが引き継ぐ前に呼び出されるでしょう、その場合あなたはビジネスに戻るでしょう。

于 2011-04-27T22:09:18.097 に答える
0

トラップがゼロ以外の戻りコードの結果である場合は、SIGCHLDをトラップし、次のことを確認することでこれを理解できます。$? -eq 0

これの欠点は、子プロセスが戻るたびにトラップが発生することです。しかし、あなたはただ短絡することができます[[ $? -eq 0 ]] return

詳細については、トラップがSIGSEGVをキャッチできないを参照してください。

私があなたの質問を誤解した場合は申し訳ありませんが、うまくいけばこれがお役に立てば幸いです。あなたの質問はSIGSEGVに固有のものではないことは知っていますが、set -eステータスコードがゼロ以外であるために終了する場合はいつでも適用されるため、引き続き適用できるはずです。

編集:あなたにサスペンスを保存するために、SIGCHLDをトラップするために、あなたはtrap <expression> CHLD、最も合理的な人々が想定しているようにではなく、を使用しますtrap <expression> SIGCHLD:)

于 2021-01-03T23:34:53.877 に答える