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)、トランスポートモードでは、標準入力から送信されるEメール本文を読み取ります。

通常、空のメールを送信したくありません。通常、本文が空の場合は何かが間違っているというシグナルなので、コマンドはmail警告します。

AIXコマンドにこの警告を無効にする方法があるかどうかはわかりませんがmail(他の警告やエラーメッセージで削除することはできますが)、空白行などの最小限の本文を送信することも2> /dev/nullできます。See subject.

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

したがって、それらを1つにまとめます。

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で開くことは、ループ内のコマンドがinfilefdから読み取られないことを保証します。

また見なさい:

おすすめ記事