명령의 stderr 스트림을 로그 파일에 저장하고 싶지만 전체 출력(stdout + stderr)도 화면에 표시하고 싶습니다. 어떻게 해야 하나요?
stdout + stderr을 콘솔에 표시하고 두 스트림을 모두 파일로 리디렉션하는 솔루션만 찾았습니다.
foo | tee output.file
(https://stackoverflow.com/questions/418896/how-to-redirect-output-to-a-file-and-stdout)
하지만 stderr을 로그 파일로 리디렉션하고 싶습니다.
답변1
최근 bash에서는 프로세스 대체를 사용할 수 있습니다.
foo 2> >(tee stderr.txt)
이것은 단지 tee를 실행하는 프로그램에 stderr를 보내는 것입니다.
더 휴대하기 편리함
exec 3>&1
foo 2>&1 >&3 | tee stderr.txt
이는 파일 설명자 3을 현재 표준 출력(즉, 화면)의 복사본으로 만든 다음 파이프를 설정하고 실행합니다 foo 2>&1 >&3
. 이는 foo의 stderr을 현재 stdout(즉, 파이프)과 동일한 위치로 보낸 다음 stdout을 fd 3(원시 출력)으로 보냅니다. 이 파이프는 foo의 원시 stderr을 tee에 공급하여 이를 파일에 저장하고 화면에 보냅니다.
답변2
내가 찾을 수 있는 가장 좋은 답변은 다음과 같습니다. 여기
(cmd 2> >(tee /dev/stderr)) > log
그것은 두 개의 파이프 (표준 출력그리고표준 에러) 둘 다 (화면그리고문서) 인라인 조건에서 사용될 때 오류를 잡을 수 있습니다(만약에) 또는 연속적인 인라인 명령.
전임자:
$((curl "https://unix.stackexchange.com" 2> >(tee /dev/stderr)) >> logfile) && echo "some other commands if curl succeeds without error"
이와 같이 파이프를 티에 연결하는 등의 다른 방법으로는(|티...), 다음 명령(에코...) 어쨌든 실행됩니다(컬) 성공 또는 실패, 고려하기 때문에 (티)는 실행된 마지막 명령으로, (곱슬)