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で開くことは、ループ内のコマンドがinfile
fdから読み取られないことを保証します。
また見なさい:
- 「IFS=read-r-line」を理解する行をそのまま読む正しい構文を入手してください。
- なぜprintfがechoより優れているのですか?
echo
任意のデータを出力するために使用できないのはなぜですか?