在 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
当我让“mail”从 /dev/null 读取时,它可以工作:
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
(或者最好是标准mailx
),在发送模式下,读取要从标准输入发送的电子邮件正文。
您通常不想发送空电子邮件。通常情况下,空身体是出现问题的迹象,这就是为什么你的mail
命令会向你发出警告。
我不知道 AIXmail
命令是否有办法禁用该警告(尽管您可以将其与任何其他警告或错误消息一起丢弃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 3 上打开infile
(与 0、1、2 相反,这并不特殊),而不是在 fd 0 上打开也确保循环中的命令不会从中读取。
也可以看看:
- 理解“IFS=读取-r行”获取逐字读取行的正确语法。
- 为什么 printf 比 echo 更好?为什么你不能用来
echo
输出任意数据。