在 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

当我让“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 上打开也确保循环中的命令不会从中读取。

也可以看看:

相关内容