可以模板/覆蓋 STDOUT 嗎?

可以模板/覆蓋 STDOUT 嗎?

我正在調試調用堆疊並簡單地echo從各個文件輸出語句。平面日誌變得有點難以理解,所以我很好奇嵌套輸出的最佳方法是什麼。

我認為如果我可以重載 STDOUT 流,則將環境變數設為製表符數量或作為前綴空格/製表符字串可能是最簡單的選擇。基本上,如果我可以做一些類似STDOUT="$TABS$STDOUT"在輸出流開頭保留堆疊製表符的事情,那就太好了。

但我不確定是否可以覆蓋流?例如,如果我想在每一行前面加上連字號+空格,這可能嗎?

這樣:

echo foo
echo bar
echo foobar

生產:

- foo
- bar
- foobar

  1. 可以模板化 STDOUT 嗎?
  2. 巢狀輸出的建議方法是什麼,而無需修改可能呼叫的許多不同腳本中的所有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

當然,只需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 ]]
...

相關內容