bash: stderr를 파일로 리디렉션하고 stdout + stderr을 화면으로 리디렉션합니다.

bash: stderr를 파일로 리디렉션하고 stdout + stderr을 화면으로 리디렉션합니다.

명령의 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"

이와 같이 파이프를 티에 연결하는 등의 다른 방법으로는(|티...), 다음 명령(에코...) 어쨌든 실행됩니다(컬) 성공 또는 실패, 고려하기 때문에 ()는 실행된 마지막 명령으로, (곱슬)

관련 정보