107

多くのコマンドを持ち、多くの出力を生成するテスト スクリプトがあります。 set -xorset -vとを使用するset -eため、エラーが発生するとスクリプトが停止します。ただし、問題を特定するために実行が停止した行を特定することは、依然としてかなり困難です。各行が実行される前にスクリプトの行番号を出力できる方法はありますか? set -xまたは、 ?で生成されたコマンド表示の前の行番号を出力します。または、スクリプト行の場所の問題に対処できる方法があれば、非常に役立ちます。ありがとう。

4

5 に答える 5

188

あなたはすでに を使用していると述べています-x。この変数は、オプションが設定されてPS4いる場合にコマンド ラインがエコーされる前に出力されるプロンプトの値であることを示します。デフォルトでは、その後にスペースが続きます。-x:

(現在実行中のスクリプトまたはシェル関数の行番号)PS4を出力するように変更できます。LINENO

たとえば、スクリプトが次のようになっているとします。

$ cat script
foo=10
echo ${foo}
echo $((2 + 2))

このように実行すると、行番号が出力されます。

$ PS4='Line ${LINENO}: ' bash -x script
Line 1: foo=10
Line 2: echo 10
10
Line 3: echo 4
4

http://wiki.bash-hackers.org/scripting/debuggingtipsPS4は、トレースに必要になる可能性のあるすべてのものを出力する究極のものを提供します。

export PS4='+(${BASH_SOURCE}:${LINENO}): ${FUNCNAME[0]:+${FUNCNAME[0]}(): }'
于 2013-07-23T08:28:37.373 に答える