bash 스크립트에서 "set -x"를 설정하거나 실행 스크립트를 사용하는 경우 bash -x
표준 출력과 함께 모든 인수가 화면에 인쇄됩니다.
stderr 및 stdout을 화면에 인쇄할 수 있지만 출력을 set -x
화면에 인쇄하지 않고 로그 파일로 리디렉션할 수 있습니까?
아이디어는 로그에 얻을 수 있는 모든 정보를 포함하되 일반 stdout 및 stderr만 화면에 인쇄하는 것입니다.
답변1
user1@mac1:~/tmp$ cat t1.sh
exec 4>shell.log
BASH_XTRACEFD=4
set -x
echo abc
cat ffff
user1@mac1:~/tmp$ bash t1.sh
abc
cat: ffff: No such file or directory
user1@mac1:~/tmp$ cat shell.log
+ echo abc
+ cat ffff
user1@mac1:~/tmp$
답변2
출력은 set -x
다음과 같습니다 . 예를 들어, stderr
리디렉션을 수행해야 합니다 .stderr
sh -x your_script.sh 2> debug_info.txt
stderr
의 출력을 일반 출력과 구별 하려면 출력 앞에 가 붙는다는 사실을 set -x
활용할 수 있습니다 . 기본값은 입니다.stderr
set -x
$PS4
+
bash -x your_script.bash 2> \
\
>(tee >/dev/null \
>(grep '^\+ ' > set_x_output.txt)\
>(grep -v '^\+ ' > rest_of_sdterr.txt)\
)
일반 stderr
출력 중 일부가 로 시작 하는 경우 +
기본 접두사를 변경하여 변경할 수 있습니다 PS4
.
답변3
다음 명령을 사용하여 리디렉션을 수정했습니다.
- 또한 제외할 항목을 정확하게 제어할 수 있습니다.
- 이는 BASH_XTRACEFD가 효과가 없는 4.1 이전의 bash 버전에서만 작동합니다.
exec 2> >(tee -a $LOG_FULL_NAME 2>&1 | grep -v "^+ \|^++ ") 1>&2