
我正在調試調用堆疊並簡單地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
當然,只需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 ]]
...