呼び出しスタックをデバッグし、echo
さまざまなファイルの文を出力しています。フラットログは理解するのが少し難しくなっているので、出力を入れ子にする最良の方法は何ですか?
STDOUTストリームをオーバーロードできる場合は、環境変数をタブ数に設定するか、プレフィックス付きのスペース/タブ文字列に設定するのが最も簡単なオプションかもしれません。基本的には、STDOUT="$TABS$STDOUT"
出力ストリームの先頭に蓄積されたタブを保存するなどのことができると思います。
しかし、ストリームを上書きすることが可能かどうかはわかりません。たとえば、各行の前にハイフン+スペースを追加したい場合、これは可能ですか?
だから:
echo foo
echo bar
echo foobar
生産:
- foo
- bar
- foobar
- STDOUTをテンプレートにすることはできますか?
- 呼び出すことができるさまざまなスクリプトのすべての
echo
/ステートメントを変更せずに出力をネストするための推奨方法は何ですか?printf
答え1
stdoutとstderrをマージするのが気に入らない場合は、おそらく最も簡単な方法は、-x
bashが実行されたときに各コマンドをプレフィックス(+++
ネストしたレベルの文字数など)で印刷するフラグを使用して実行することです。その後、プレフィックスを覚えていますが、行を抑制して出力を後処理し、プレフィックスのない後続の行(echoまたはprintf)に適用できます。
たとえば、小さな継承スクリプトを使用しますmyprog
。
#!/bin/bash
f(){
local i=$1
if [[ "$i" > 1 ]]
then echo $((i*$(f $((i-1)))))
else echo $i
fi
echo "my debug info $i" >&2
}
echo "factorial ${1?} is $(f $1)"
実行する
bash -x myprog 4 |&
awk '/^+/{ indent=$1; next }
{ print indent " " $0 }'
あなたのため
+++++ my debug info 1
++++ my debug info 2
+++ my debug info 3
++ my debug info 4
+ factorial 4 is 24
もちろん.egをPS4
使用してください-x
。
PS4='+ ${BASH_SOURCE}:${LINENO}: ${FUNCNAME[0]} - [${SHLVL},${BASH_SUBSHELL}, $?] '
あなたのため:
++ myprog:10: main - [2,1, 0] f 4
++ myprog:3: f - [2,1, 0] local i=4
++ myprog:4: f - [2,1, 0] [[ 4 > 1 ]]
+++ myprog:5: f - [2,2, 0] f 3
+++ myprog:3: f - [2,2, 0] local i=3
+++ myprog:4: f - [2,2, 0] [[ 3 > 1 ]]
++++ myprog:5: f - [2,3, 0] f 2
++++ myprog:3: f - [2,3, 0] local i=2
++++ myprog:4: f - [2,3, 0] [[ 2 > 1 ]]
...