#!/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'