STDOUT을 템플릿화/재정의할 수 있나요?

STDOUT을 템플릿화/재정의할 수 있나요?

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

STDOUT 스트림을 오버로드할 수 있다면 환경 변수를 탭 수로 설정하거나 접두사가 붙은 공백/탭 문자열로 설정하는 것이 가장 쉬운 옵션일 수 있다고 생각합니다. 기본적으로 STDOUT="$TABS$STDOUT"출력 스트림 시작 부분에 누적된 탭을 보존하는 것과 같은 작업을 수행할 수 있다면 좋을 것입니다.

하지만 스트림을 덮어쓰는 것이 가능한지 잘 모르겠습니다. 예를 들어 각 줄 앞에 하이픈 + 공백을 추가하려는 경우 이것이 가능합니까?

그래서:

echo foo
echo bar
echo foobar

생산:

- foo
- bar
- foobar

  1. STDOUT을 템플릿으로 만들 수 있나요?
  2. 호출될 수 있는 다양한 스크립트의 모든 echo/ 문을 수정하지 않고 출력을 중첩하는 권장 방법은 무엇입니까?printf

답변1

stdout과 stderr을 병합하는 것이 마음에 들지 않는다면 아마도 가장 쉬운 방법은 -xbash가 실행될 때 각 명령을 접두사( +++중첩 수준의 문자 수와 같은)로 인쇄하도록 하는 플래그를 사용하여 실행하는 것입니다. 그런 다음 접두사를 기억하지만 행을 억제하여 출력을 사후 처리하고 접두사가 없는 후속 행(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 ]]
...

관련 정보