화면과 메일 모두에 출력을 보내는 방법은 무엇입니까?


9

스크립트 끝에서 다음을 사용하여 전자 메일을 보냅니다.

echo "Script finished on `date`" | /usr/bin/Mail -s "Script complete" "myaccount@myserver.com".

그러나 동일한 메시지를 화면에 표시하고 싶습니다. 같은 진술에서 어떻게해야합니까?

답변:


19

가장 쉬운 방법은 teestdout뿐만 아니라 stderr에게 보내는 메시지입니다.

echo "Script finished on date" | tee /dev/stderr \
    | /usr/bin/Mail -s "Script complete" "myaccount@myserver.com"

teestdout을 포함하여 여러 대상에 입력을 복제합니다. 기본적으로 stderr과 stdout은 모두 화면으로 이동합니다. stdout을로 리디렉션하고 Mailstderr 만 화면으로 이동합니다.

어떤 이유로 stdout에 필요한 경우 서브 쉘 (또는 다른 여러 가지 방법)을 사용하여 다시 리디렉션 할 수 있습니다.

(
    echo "Script finished on date" | tee /dev/stderr \
        | /usr/bin/Mail -s "Script complete" "myaccount@myserver.com"
) 2>&1

3
또는 파일에 티를 꽂고 파일을 우편으로 보내십시오. 출력이 너무 커서 base64로 인코딩 된 gzipped MIME 첨부 파일과 같이 보내려는 경우 매우 유용합니다. 또는 모든 출력을 파일로 리디렉션 exec &> $LOGFILE한 다음 (예 :를 사용하여 ) stdout을 복원하고 파일을 stdout에 배치하여 메일로 보내십시오.
cas

크레이그 감사합니다. 이 경우 내 텍스트는 매우 작으므로 derobert의 답변을 따르겠습니다.
새미

흠 .. 이것은 효과가 있었지만 문제 설명에 더 추가해야한다는 것을 깨달았습니다. 이 솔루션을 스크립트의 마지막 줄로 사용했습니다. 스크립트에서 "nohup"명령을 사용하여 스크립트의 모든 출력을 "nohup.out"으로 수집했으며이 한 줄만 "XXxx에서 스크립트 완료"로 표시됩니다. 이 솔루션을 사용하기 전에 모든 스크립트 출력에 문제가 없었습니다. 이 마지막 한 줄의 출력을 모두 지우지 않고 추가하는 방법이 있습니까?
새미

1
"tee -a"를 사용하면 문제가 해결되었습니다.
새미
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.