sed를 사용하여 bash 디버그 출력을 편집하는 방법은 무엇입니까? (배쉬-x)

sed를 사용하여 bash 디버그 출력을 편집하는 방법은 무엇입니까? (배쉬-x)
#!/bin/bash -x
echo This is a script that has debugging turned on

스크립트 출력

+ echo This is a script that has debugging turned on
This is a script that has debugging turned on

+를 제거하거나 교체하여 제거하고 싶습니다. 나는 sed가 내 문제( sed 's/^\++//g')를 해결할 것이라고 예상했지만 이 접근 방식은 디버그 출력 라인에 영향을 미치지 않습니다.

더 많은 실험을 한 후에 발견했습니다.디버그 출력이 stderr에 기록된 것으로 나타납니다.(이를 명령어로 추론한 ./test.sh 2>/dev/null뒤 디버그 라인을 제외하고 출력한다)

이 새로운 정보를 통해 이것이 효과가 있기를 바랍니다. ./test.sh 2>&1 | sed 's/^\++//g'

하지만 아쉽게도 여전히 원치 않는 동일한 결과가 나타납니다.

+ echo This is a script that has debugging turned on
This is a script that has debugging turned on

답변1

이것이 팁 +입니다 . PS4빈 문자열로 설정합니다.

#!/bin/bash

PS4=''
set -x

echo 'This is a script that has debugging turned on'

시험:

$ bash script.sh
echo 'This is a script that has debugging turned on'
This is a script that has debugging turned on

또는 원본 스크립트의 경우 PS4스크립트를 호출할 때 빈 문자열로 설정합니다.

$ PS4='' ./script.sh
echo This is a script that has debugging turned on
This is a script that has debugging turned on

타임스탬프를 삽입하는 데 사용할 수 있습니다.

$ PS4='$(date +"%T: ")' ./script.sh
21:08:19: echo 'This is a script that has debugging turned on'
This is a script that has debugging turned on
21:08:19: echo 'Now sleeping for 2 seconds'
Now sleeping for 2 seconds
21:08:19: sleep 2
21:08:21: echo Done
Done

답변2

당신이 직면하는 주요 제한 사항 +은 다음과 같습니다확장된 정규식 기능이므로 대부분의 경우 확장 정규식 기능을 활성화해야 합니다. sed이는 -E플래그와 관련이 있습니다.

./test.sh 2>&1 | sed -E 's/^\++ //'

나는 두 가지 다른 변경 사항을 적용했습니다.

  • 디버그 명령이 왼쪽 정렬로 표시되도록 후행 공백을 추가했습니다.
  • /g정규 표현식이 고정되어 한 줄에 하나의 일치 항목만 있을 수 있으므로 플래그가 제거되었습니다 .

답변3

stderr를 프로세스 교체로 리디렉션할 수 있습니다. 그러나 이는 출력 순서에 영향을 미칠 수 있습니다.

$ bash -x -c 'hostname; echo "$(date)"'
+ hostname
jackmanVM
++ date
+ echo 'Tue Oct 23 15:22:02 EDT 2018'
Tue Oct 23 15:22:02 EDT 2018

$ bash -x -c 'hostname; echo "$(date)"' 2> >(sed -E 's/^\++/debug: /')
debug:  hostname
jackmanVM
debug:  date
Tue Oct 23 15:22:35 EDT 2018
debug:  echo 'Tue Oct 23 15:22:35 EDT 2018'

관련 정보