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에서 읽히지 않도록 보장합니다.
또한보십시오:
- "IFS=read-r-line" 이해줄을 그대로 읽는 올바른 구문을 얻으세요.
- 왜 printf가 echo보다 나은가요?
echo
임의의 데이터를 출력 하는 데 사용할 수 없는 이유는 무엇입니까 ?