stderr 손실 없이 스크립트 변수를 로그 파일로 리디렉션

stderr 손실 없이 스크립트 변수를 로그 파일로 리디렉션

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활용할 수 있습니다 . 기본값은 입니다.stderrset -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

관련 정보