通过电子邮件发送 FreeBSD 脚本输出丢失格式(在一行中左对齐和右对齐)

通过电子邮件发送 FreeBSD 脚本输出丢失格式(在一行中左对齐和右对齐)

我每天都会在路由器上运行一个脚本来检查特定服务器的流量使用情况。该脚本运行良好,使用脚本的此输出部分,我得到以下结果:

#Give output
printf "Traffic Report for all Servers"; printf "%10s\n"
echo -e ""
printf "## Traffic Server 1 ##"; printf "%10s\n"
echo "--------------------------------------"
printf "Traffic User1 :"; printf "%15s\n" "1200.00 GB"
printf "Traffic Client123:"; printf "%12s\n" "385.00 GB"
printf "Traffic Max:"; printf "%18s\n" "0 GB"
printf "Traffic Smith:"; printf "%16s\n" "987.00 GB"
printf "Traffic Johanna:"; printf "%14s\n" "30.00 GB"
printf "Traffic Other:"; printf "%16s\n" "8.97 GB"
echo "--------------------------------------"
printf "Traffic Gesamt DE:"; printf "%12s\n" "1524.00 GB"
printf "Traffic Quota DE:"; printf "%13s\n" "2000.00 GB"
printf "Traffic Rest DE:"; printf "%14s\n" "500.00 GB"
Traffic Report for all Servers

## Traffic Server 1 ##
--------------------------------------
Traffic User1 :     1200.00 GB
Traffic Client123:   385.00 GB
Traffic Max:              0 GB
Traffic Smith:       987.00 GB
Traffic Johanna:      30.00 GB
Traffic Other:         8.97 GB
--------------------------------------
Traffic Gesamt DE:  1524.00 GB
Traffic Quota DE:   2000.00 GB
Traffic Rest DE:     500.00 GB

到目前为止一切都正确,我就是想看到这个输出。但如果我使用脚本通过 ssmtp 通过电子邮件发送此输出

    #!/bin/sh
    #set -x
    
    #Give output
    {
    printf "Traffic Report for all Servers"; printf "%10s\n"
    echo -e ""
    printf "## Traffic Server 1 ##"; printf "%10s\n"
    echo "--------------------------------------"
    printf "Traffic User1 :"; printf "%15s\n" "1200.00 GB"
    printf "Traffic Client123:"; printf "%12s\n" "385.00 GB"
    printf "Traffic Max:"; printf "%18s\n" "0 GB"
    printf "Traffic Smith:"; printf "%16s\n" "987.00 GB"
    printf "Traffic Johanna:"; printf "%14s\n" "30.00 GB"
    printf "Traffic Other:"; printf "%16s\n" "8.97 GB"
    echo "--------------------------------------"
    printf "Traffic Gesamt DE:"; printf "%12s\n" "1524.00 GB"
    printf "Traffic Quota DE:"; printf "%13s\n" "2000.00 GB"
    printf "Traffic Rest DE:"; printf "%14s\n" "500.00 GB"
    } | ssmtp -F Sender [email protected]
    #End

结果看起来完全不同,与终端中的输出一样。

Traffic Report for all Servers
 
## Traffic Server 1 ##
--------------------------------------
Traffic User1 :    1200.00 GB
Traffic Client123:   385.00 GB
Traffic Max:           0 GB
Traffic Smith:     987.00 GB
Traffic Johanna:     30.00 GB
Traffic Other:       8.97 GB
--------------------------------------
Traffic Gesamt DE:  1524.00 GB
Traffic Quota DE:  2000.00 GB
Traffic Rest DE:   500.00 GB

很奇怪,我刚刚发现,如果我将电子邮件中的文本复制到此处的文本框中,文本会正确对齐,但我只能在电子邮件中看到它,就像上面那样。

有人知道如何让输出风格与电子邮件相同吗?谢谢

答案1

很奇怪,我刚刚发现,如果我将电子邮件中的文本复制到此处的文本框中,文本会正确对齐,但我只能在电子邮件中看到它,就像上面那样。

文本是纯文本,其中“格式化”由连续空格完成。没有信息表明某些部分应该右对齐。只有右侧部分前面有空格。如果字体是等宽字体

终端和终端仿真器通常使用固定宽度的字体。这样,不仅可以正确显示像您这样的文本;简单的框可以绘制,可以绘制更复杂的布局(如的界面mc)。如果渲染不同宽度的字符,可能会破坏布局(例子)。

使用代码的 GUI 程序使用等宽字体(因为缩进、字符串和代码通常这样看起来更好,我们根据经验知道这一点),但通用 GUI 程序通常使用可变宽度字体(因为文学作品这样看起来更好)。显然,您的电子邮件客户端使用可变宽度字体向您显示纯文本。

在所讨论的电子邮件中,所有空格都存在;如果您将文本粘贴到终端,则它将正确对齐;问题是当您查看电子邮件时,空格不如字母和数字宽(并且某些字母不如其他字母宽)。

我们甚至可以在这里看到差异1.此站点对代码块使用固定宽度的字体:

Example 1
Traffic Client123:   385.00 GB
Traffic Max:              0 GB

它使用可变宽度的文本字体:

示例 2
流量客户端 123:385.00 GB
流量最大值:0 GB

情况可能更糟。在示例 2 中,我将常规 ASCII 空格替换为不间断空格,因为该网站将连续的常规空格视为一个,如果我不进行抵消,那么它将看起来像这样:

示例 3
流量客户端 123:385.00 GB
流量最大值:0 GB

您的电子邮件客户端可能不会压缩连续的空格,它会像示例 2 中那样呈现文本。但对齐方式仍然不像示例 1 那样。

配置您的电子邮件客户端,使纯文本使用固定宽度字体。如果您不能或不想这样做,则需要将电子邮件中未对齐的文本粘贴到文本编辑器中,以享受对齐效果。如果配置为使用固定宽度字体,则可能是 GUI 编辑器;或者基本上是终端仿真器中的任何文本编辑器(除非您的终端仿真器本身配置为使用可变宽度字体,但这种情况不太可能发生)。

或者,如果您的电子邮件客户端可以呈现 HTML 格式的电子邮件,请修改您的脚本以发送 HTML 而不是纯文本。我相信您可以在 HTML 中指定字体(显然在这种情况下您需要固定宽度的字体);或者您可以使用指令而不是空格来对齐。我不太懂 HTML,但我发现了这一点:如何在同一行中将文本左对齐和右对齐?请注意,您的选项受限于您的电子邮件客户端所能解释的内容。


1不同系统中的不同浏览器可能使用不同的字体;此外,浏览器可能配置为使用与请求的网站不同的字体。因此,您可能会或可能不会以我预期的方式看到我的示例。为了以防万一,下面的屏幕截图显示了示例的预期外观(单击以查看完整尺寸):

examples as screenshot

相关内容