AIX ksh에서 "mail" 명령은 STDIN에서 읽고 루프를 중지합니다.

AIX ksh에서 "mail" 명령은 STDIN에서 읽고 루프를 중지합니다.

AIX 7.2 시스템에서 ksh 사용

다음과 같은 입력 파일이 있습니다.

line1   
line2  
line3

다음 코드가 있습니다 (다소 단순화됨)

cat infile | while read strA ; do  
    echo "strA: $strA"  
    mail -s"check script strA: $strA" [email protected]  
done  

"mail"은 STDIN에서 읽은 것처럼 보이며 첫 번째 줄 이후 루프가 중지됩니다.
결과 :

line1  
=>sending mail

/dev/null에서 "mail"을 읽으면 작동합니다.

mail -s"check script strA: $strA" [email protected] </dev/null  

하지만이렇게 하면 "메시지 본문 없음"이라는 경고가 표시됩니다.

비어 있지 않은 더미 파일을 제공할 때도 작동합니다`

   mail -s"check script strA: $strA" [email protected] </tmp/anyexistingfile  

하지만쓰레기를 보내고 싶지 않아요

STDIN에서 읽는 것을 방지하고 루프를 종료하는 다른 방법이 있습니까?
비밀 이메일 옵션이 있나요? (못찾 겠어요)

미리 감사드립니다.

(글쎄... 문제를 설명하는 데 10분, 텍스트 형식을 지정하는 데 20분이 걸렸습니다.)

답변1

mail(또는 Standard 가 바람직함 mailx), 전송 모드에서는 표준 입력에서 보낼 이메일 본문을 읽습니다.

일반적으로 빈 이메일을 보내고 싶지 않습니다. 일반적으로 본문이 비어 있으면 뭔가 잘못되었다는 신호이므로 명령이 mail경고합니다.

AIX 명령에 이 경고를 비활성화할 수 있는 방법이 있는지는 모르겠지만 mail(다른 경고나 오류 메시지와 함께 삭제할 수는 있지만 ) 빈 줄 2> /dev/null과 같은 최소한의 본문을 보낼 수도 있습니다 .See subject.

echo See subject. | mailx...
echo | mailx...

따라서 그것들을 하나로 합치십시오:

while IFS= read <&3 -r strA ; do  
  printf 'strA: "%s"\n' "$strA"  
  echo | mailx -s"check script strA: $strA" [email protected]  
done 3< infile

fd 0에서 여는 것보다 (특별하지 않은 0,1,2와 반대되는) fd 3에서 여는 것도 infile루프의 명령이 fd에서 읽히지 않도록 보장합니다.

또한보십시오:

관련 정보