STDOUT을 템플릿화하거나 덮어쓸 수 있습니까?

STDOUT을 템플릿화하거나 덮어쓸 수 있습니까?

호출 스택을 디버깅하고 echo다양한 파일의 명령문을 출력하고 있습니다. 플랫 로그는 따라가기가 조금 어려워지고 있는데 출력을 중첩하는 가장 좋은 방법이 무엇인지 궁금합니다.

STDOUT 스트림을 오버로드할 수 있다면 환경 변수를 탭 수 또는 접두사 공백/탭 문자열로 설정하는 것이 가장 쉬운 옵션이 될 수 있다고 생각했습니다. 기본적으로 STDOUT="$TABS$STDOUT"출력 스트림의 시작 부분에 탭 문자를 계속 쌓아 두는 것과 같은 작업을 수행할 수 있다면 좋을 것입니다 .

하지만 스트림을 덮어쓰는 것이 가능한지 확신할 수 없었습니다. 예를 들어, 모든 줄에 하이픈+공백을 붙이고 싶다면 가능할까요?

다음과 같습니다:

echo foo
echo bar
echo foobar

생산물:

- foo
- bar
- foobar

  1. STDOUT 템플릿이 가능합니까?
  2. 호출될 수 있는 다양한 스크립트에서 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 ]]
...

관련 정보