Korn Shell - env、printenv、export - 如何将 CRLF 作为分隔符

Korn Shell - env, printenv, export - How to get CRLF as a delimiter

这看起来很简单,但我找不到任何关于如何做到这一点的信息:我基本上是使用 KSH 变量来构建我的电子邮件正文。在 error/exception 的情况下,我想转储 env/printenv/export 以及使用 '\n' 作为分隔符。

if (( $status != 0 ))
then
    MESSAGE="${MESSAGE}\n"
    MESSAGE="${MESSAGE}\n\tBatch Process\t: ${BATCHPROCESS}"
    MESSAGE="${MESSAGE}\n\tEnvironment\t: ${ENVTEXT}"
    MESSAGE="${MESSAGE}\n\tDate/Time\t: ${STARTDATETIME}"
    MESSAGE="${MESSAGE}\n\nRuntime:"
    MESSAGE="${MESSAGE}\n$(env)"
    echo -e $MESSAGE >>  ${MAILFILE1}
    mail -s"FAILURE - ${SUBJECT} " $MAILLIST <  ${MAILFILE1}

因此,根据 env/printenv/export 上的文档,它已经使用 LF 作为分隔符,但是当我收到电子邮件时,它只是一大块文本:

Runtime:

Runtime:

我想要的是每个变量单独一行:

Runtime : 
ACCESSDB=[Sybase-Database]
ACCESSSRV=[Sybase-Server]
...etc...

有没有强制使用'\n'来代替当前使用的 LF?

更新:我正在使用 sed -s 's/$/\r\n/g' 并且它正在格式化 env 输出,但现在整个电子邮件正文文本作为附件发送:

if (( $status != 0 ))
then
    MESSAGE="${MESSAGE}\n"
    MESSAGE="${MESSAGE}\n\tBatch Process\t: ${BATCHPROCESS}"
    MESSAGE="${MESSAGE}\n\tEnvironment\t: ${ENVTEXT}"
    MESSAGE="${MESSAGE}\n\tDate/Time\t: ${STARTDATETIME}"
    env | sort | sed 's/$/\r\n/g' > ${TEMPFILES}/env.txt
    MESSAGE="${MESSAGE}\n\nRuntime:"
    MESSAGE="${MESSAGE}\n$(cat ${TEMPFILES}/env.txt)"

    echo -e "$MESSAGE" >>  ${MAILFILE1}
    mail -s"FAILURE - ${SUBJECT} " $MAILLIST <  ${MAILFILE1}

有什么想法吗?我认为这是关于最大电子邮件大小的某种邮件设置,但我是 Java 程序员而不是 shell 脚本编写者...

关闭解决方案:原来是 \r\n 导致了附件问题 [https://access.redhat.com/solutions/1136493]。所以我使用了 sed -s 's/$/\n/g' 这与我想要的非常接近,除了使用双行输出 env :

if (( $status != 0 ))
then
    MESSAGE="${MESSAGE}\n"
    MESSAGE="${MESSAGE}\n\tBatch Process\t: ${BATCHPROCESS}"
    MESSAGE="${MESSAGE}\n\tEnvironment\t: ${ENVTEXT}"
    MESSAGE="${MESSAGE}\n\tDate/Time\t: ${STARTDATETIME}"
    MESSAGE="${MESSAGE}\n\nRuntime:"
    MESSAGE="${MESSAGE}\n$(env | sort | sed 's/$/\n/g')"

    echo -e "$MESSAGE" >>  ${MAILFILE1}
    mail -s"FAILURE - ${SUBJECT} " $MAILLIST <  ${MAILFILE1}

产生输出:

Runtime:
ACCESSDB=[Sybase-Database]

ACCESSSRV=[Sybase-server]

ARCHIVEDB=[Sybase-Database]

ASBIN=[Directory-Path]

最终解决方案:实施 markp 的修复,然后取出我的 sed -s 东西,它可以正常工作:

if (( $status != 0 ))
then
    MESSAGE="${MESSAGE}\n"
    MESSAGE="${MESSAGE}\n\tBatch Process\t: ${BATCHPROCESS}"
    MESSAGE="${MESSAGE}\n\tEnvironment\t: ${ENVTEXT}"
    MESSAGE="${MESSAGE}\n\tDate/Time\t: ${STARTDATETIME}"
    MESSAGE="${MESSAGE}\n\nRuntime:"
    MESSAGE="${MESSAGE}\n$(env | sort)"

    echo -e "$MESSAGE" >>  ${MAILFILE1}
    mail -s"FAILURE - ${SUBJECT} " $MAILLIST <  ${MAILFILE1}

蒂亚,阿迪姆

尝试将 $MESSAGES 括在双引号中以保持特殊格式、白色 space 等:

echo -e "$MESSAGE" >>  ${MAILFILE1}

使用 'echo -e' 和 'mail -s' 命令是否能达到预期效果取决于您使用的是哪个版本的命令。

正如@markp 正确观察到的,您对

的使用
echo $MESSAGE >>$MAILFILE1

会将字符串 $MESSAGE 替换为几个白色 space 分隔的参数来回显,而 echo 只会在参数之间放置一个 space 。这类似于键入

$ echo a     b               c
a b c

我处在你的位置就这样做

 echo "$MESSAGE"                         >>$MAILFILE1
 echo "Batch Process:\t $BATCHPROCESS"   >>$MAILFILE1
 echo "Environment: ...."                >>$MAKEFILE1

或者使用内嵌文档:

   cat <<FINE >>$MAKEFILE1
$MESSAGE
Batch Process:      $BATCHPROCESS
Environment: ....
....
FINE