모든 출력을 로그로 보내려고 하는데 stderr도 콘솔에 표시됩니다.
..로그 항목을 순서대로 기록하고 어떤 방법을 사용하여 로그+콘솔에 주석을 보냅니다(stderr과 동일).
exec &> log
예를 들어 다음은 작동하지 않습니다.
#!/bin/bash
exec 2> >(tee log) 2>&1 > build.log
echo "Yes 1"
ugh "No 1"
echo "Yes 2"
ugh "No 2"
echo "Message to user" 3>&1
여기와 다른 곳에서 찾은 예제는 섞거나 로그 및 콘솔로 리디렉션됩니다.
이 예제 중 어느 것도 모든 출력을 로그로 보내지 않습니다. stderr 및 "특수 메시지"도 화면에 표시됩니다.
해결책
Chris는 아래 답변에서 이 문제를 해결합니다. 적합한 솔루션은 다음과 같습니다.
#!/bin/bash
exec 3> >(tee -a log)
exec 4>>log
exec >&4 2>&3
# Out: To log.
echo "I'm standard output."
# Error: To log and console.
ugh "command not found"
# Message: To log and console.
echo "Message to user." >&3
주어진 설명에서 제안한 대로 로그/콘솔에 기록됩니다.
답변1
이 작업이 스크립트에서 수행되었다고 가정합니까? 그렇다면 이것이 귀하의 요구 사항을 충족해야한다고 생각합니다. stdout
으로만 전송됩니다 out.txt
. stderr
콘솔로 전송됩니다.err.txt
#!/bin/bash
exec 3> >(tee ./err.txt)
exec 4>./out.txt
exec >&4 2>&3
echo "I'm normal text!" # only in out.txt
echo "I'm an error!" >&2 # in err.txt and on console
편집하다:나는 이 작은 스크립트에 매우 만족했지만 그 이유는 잘 모르겠습니다.
편집 2:동일한 파일에 두 개의 스트림을 쓰려면 두 위치 모두에서 동일한 파일 이름을 사용하면 됩니다. 이론적으로 이것은 stdout과 stderr 사이의 순서 손실을 거의 초래하지 않습니다. 실제로는 충분히 가깝습니다. (자세한 내용은 아래 내 장황한 의견을 참조하세요.)