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
这看起来很简单,但我找不到任何关于如何做到这一点的信息:我基本上是使用 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