
호출 스택을 디버깅하고 echo
다양한 파일의 명령문을 출력하고 있습니다. 플랫 로그는 따라가기가 조금 어려워지고 있는데 출력을 중첩하는 가장 좋은 방법이 무엇인지 궁금합니다.
STDOUT 스트림을 오버로드할 수 있다면 환경 변수를 탭 수 또는 접두사 공백/탭 문자열로 설정하는 것이 가장 쉬운 옵션이 될 수 있다고 생각했습니다. 기본적으로 STDOUT="$TABS$STDOUT"
출력 스트림의 시작 부분에 탭 문자를 계속 쌓아 두는 것과 같은 작업을 수행할 수 있다면 좋을 것입니다 .
하지만 스트림을 덮어쓰는 것이 가능한지 확신할 수 없었습니다. 예를 들어, 모든 줄에 하이픈+공백을 붙이고 싶다면 가능할까요?
다음과 같습니다:
echo foo
echo bar
echo foobar
생산물:
- foo
- bar
- foobar
- STDOUT 템플릿이 가능합니까?
- 호출될 수 있는 다양한 스크립트에서
echo
/ 문을 모두 수정하지 않고도 출력을 중첩하기 위해 제안되는 방법은 무엇입니까 ?printf
답변1
아마도 stdout과 stderr을 병합하는 것이 마음에 들지 않는다면 가장 쉬운 방법은 bash가 중첩 수준에서 문자 수가 나오는 위치 -x
와 같은 접두사를 사용하여 실행될 때 각 명령을 인쇄하도록 하는 플래그를 사용하여 실행하는 것입니다. +++
그런 다음 접두사를 기억하지만 행을 억제하고 접두사가 없는 다음 행(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 ]]
...