Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 所有行在电子邮件中一起运行_Linux_Bash_Email_Echo - Fatal编程技术网

Linux 所有行在电子邮件中一起运行

Linux 所有行在电子邮件中一起运行,linux,bash,email,echo,Linux,Bash,Email,Echo,这应该是相对简单的,但我从来没有遇到过,现在我抓挠我的头 简单脚本: echo `tail /var/log/qmailcheck.log` >> $EMAIL cat $EMAIL | mail -s "Daily server report from server.ca" email@here.com (我知道我在尾部缺少一组记号cmd只是想让事情看起来正常) 问题是,尽管我跟踪的日志文件中的每个条目都有一行新行,但发送的电子邮件将所有内容都放在一行上,所以不是这样: Mon

这应该是相对简单的,但我从来没有遇到过,现在我抓挠我的头

简单脚本:

echo `tail /var/log/qmailcheck.log` >> $EMAIL
cat $EMAIL | mail -s "Daily server report from server.ca" email@here.com
(我知道我在
尾部缺少一组记号
cmd只是想让事情看起来正常)

问题是,尽管我跟踪的日志文件中的每个条目都有一行新行,但发送的电子邮件将所有内容都放在一行上,所以不是这样:

Mon Feb 4 11:05:01 MST 2013--检查已成功完成
2013年2月4日星期一11:10:01 MST--检查已成功完成
2013年2月4日星期一11:15:01——检查已成功完成
2013年2月4日星期一11:20:01 MST--检查已成功完成
2013年2月4日星期一11:25:01——检查已成功完成

我明白了:
2013年2月4日11:05:01星期一-2013年2月4日11:10:01星期一检查成功完成-2013年2月4日11:15:01星期一检查成功完成-2013年2月4日11:20:01星期一检查成功完成-2013年2月4日11:25:01星期一检查成功完成

该脚本还与许多其他命令相呼应,它们似乎也运行在一行中,我以前做过这件事,但从未遇到过问题,我遗漏了什么

以下是整个脚本:

ERROR=/tmp/errorlog
RECIP=$(cat /root/bin/emailrec)

echo Hi, this email to inform you of any potential issues with the server.bla qmail mail server > /tmp/demail

grep pls /var/log/qmailcheck.log > /tmp/errorlog

if [ ! -s $ERROR ] ; then
    echo There are no errors in the qmailcheck log file >> /tmp/demail
    echo Here are the last 10 lines of the current qmailcheck log file: >> /tmp/demail
    tail /var/log/qmailcheck.log >> /tmp/demail
else
    echo The log file for the qmail check script contains the following errors: >> /tmp/demail
    cat $ERROR >> /tmp/demail
    echo You should have also received an email which will better explain the error >> /tmp/demail
    echo Check the time of the error above to determine when the email was sent >> /tmp/demail
fi
MAIL=$(/var/qmail/bin/qmail-qstat | grep "queue:" | awk '{ print $4 }')
echo There are $MAIL messages in the mail queue >> /tmp/demail

echo File system usage is currently at `df -h |grep vzfs | awk '{ print $5}'` >> /tmp/demail


cat /tmp/demail | mail -s "Daily server report from server.bla" $RECIP

这就是在不需要echo和命令替换时使用echo和命令替换所得到的结果

两者之间的唯一区别

echo `command args...`

换行符被折叠(代码更难阅读)。只用

tail /var/log/qmailcheck.log | mail -s ....
(如果要使用中间文件,则也可以使用它,而不使用
echo
或反勾号)

请注意,还有另一种命令替换样式:
$(command…
),它消除了嵌套引用的问题,通常更具可读性。无论何时需要命令替换,都可以使用此样式而不是反勾号。

更改:

echo `tail /var/log/qmailcheck.log` >> $EMAIL
致:

用双引号包装命令替换可以防止字符串拆分,这是换行符转换为空格的地方


然而,我建议使用安东·科瓦连科的解决方案。这里根本不需要使用
echo
,只需将命令直接重定向到文件。

好的,我无法很好地将内容粘贴到这里,看看这是整个脚本……我想我已经完成了你们提到的,但我的电子邮件中仍然有相同的未格式化行?谢谢将脚本粘贴到问题中,用鼠标滑动,然后单击
{}
工具将其标记为代码。更新的脚本中没有任何内容会导致行合并。我怀疑你的邮件阅读器正在包装邮件。与消息的原始源进行比较。
echo `tail /var/log/qmailcheck.log` >> $EMAIL
echo "`tail /var/log/qmailcheck.log`" >> $EMAIL