로그로 전송되어 콘솔에 표시됨

로그로 전송되어 콘솔에 표시됨

여기에 오류 처리 기능이 있는 작은 테스트 스크립트가 있습니다. 모든 STDERR 및 STDOUT이 콘솔(현재)에 표시되고 로그 파일로 작성되기를 원합니다.

#!/bin/bash

# error handling
function error_handler() {
  echo "Error occurred in script at line: ${1}."
  echo "Line exited with status: ${2}"
}

trap 'error_handler ${LINENO} $?' ERR

set -o errexit
set -o errtrace
set -o nounset

if rsync -aPh ~/Downloads/Temps-linux-x64.zip .; then
        echo "SUCCESSFULL rsync of files"
else
        echo "FAILED rsync of files"
fi

처음에 추가해서 캡쳐해보았습니다;

exec 3>&1 4>&2
trap 'exec 2>&4 1>&3' 0 1 2 3
exec 1>log.out 2>&1

그러나 이는 (필요한 대로) 모든 것을 기록하지만 콘솔에는 출력이 없습니다. 또한 오류 처리가 제대로 작동하지 않게 되므로 다른 해결 방법이 필요합니다.

답변1

당신은 그것을 사용할 수 있습니다coproc로 리디렉션된 설명자

#!/bin/bash 
exec 3<&1
coproc mytee { tee log.out >&3;  }
exec >&${mytee[1]} 2>&1

... your script ...

STDOUT 및 STDERR은 스크립트 출력에 병합됩니다. 누군가 로그 파일에서는 병합하고 출력에서는 분리하는 방법을 찾았다면 좋을 것입니다.

답변2

사용 tee:

./script 2>&1 | tee log.out

tee위의 예에서 표준 입력과 지정된 파일을 복사합니다 log.out. 자세한 내용은 을 참조하세요 man tee.

관련 정보