STDOUTをテンプレート化/再定義できますか?

STDOUTをテンプレート化/再定義できますか?

呼び出しスタックをデバッグし、echoさまざまなファイルの文を出力しています。フラットログは理解するのが少し難しくなっているので、出力を入れ子にする最良の方法は何ですか?

STDOUTストリームをオーバーロードできる場合は、環境変数をタブ数に設定するか、プレフィックス付きのスペース/タブ文字列に設定するのが最も簡単なオプションかもしれません。基本的には、STDOUT="$TABS$STDOUT"出力ストリームの先頭に蓄積されたタブを保存するなどのことができると思います。

しかし、ストリームを上書きすることが可能かどうかはわかりません。たとえば、各行の前にハイフン+スペースを追加したい場合、これは可能ですか?

だから:

echo foo
echo bar
echo foobar

生産:

- foo
- bar
- foobar

  1. STDOUTをテンプレートにすることはできますか?
  2. 呼び出すことができるさまざまなスクリプトのすべてのecho/ステートメントを変更せずに出力をネストするための推奨方法は何ですか?printf

答え1

stdoutとstderrをマージするのが気に入らない場合は、おそらく最も簡単な方法は、-xbashが実行されたときに各コマンドをプレフィックス(+++ネストしたレベルの文字数など)で印刷するフラグを使用して実行することです。その後、プレフィックスを覚えていますが、行を抑制して出力を後処理し、プレフィックスのない後続の行(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 ]]
...

関連情報