호출 스택을 디버깅하고 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
물론 .e.g.를 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 ]]
...