0

标题可能含糊不清,但我有一个很好的例子:

echo "Test message:\nThis is a line.\nAnd this is another." | nail -s "`tail -1`" joe@localhost

这里的目标是将回显的内容作为消息正文发送,并使用最后一行作为主题。然而,当我这样做时,我失去了身体。

echo "Test message:\nThis is a line.\nAnd this is another." | nail joe@localhost

工作正常,但没有主题。

4

3 回答 3

2

您可以使用命名管道来执行此操作,这适用于:

mkfifo subj.fifo

echo "Test message:\nThis is a line.\nAnd this is another." |
  tee >(tail -n1 > subj.fifo) | mail -s "$(< subj.fifo)" joe@localhost

rm subj.fifo

请注意,如果您使用 head 而不是 tail,则需要发出tee忽略SIGPIPE信号,例如trap '' PIPE.

于 2013-01-02T11:57:51.797 回答
2

由于您的主题出现在最后一行,因此您必须缓冲所有行(否则,无法确定哪一行是最后一行)。将主题放在第一行会容易得多。任何。这是一种可能的方法,使用mapfilebash 4.0 中出现的方法:

printf "%s\n" "Line one in the body of message" "Line two in the body of message" "Subject in the last line" | {
    mapfile -t array
    nail -s "${array[@]: -1}" joe@localhost < <(printf "%s\n" "${array[@]:0:${#array[@]}-1}")
}

如果您决定将主题放在第一行,那会容易得多(当然,只是一个管道,除了主题之外没有多余的子壳或缓冲):

printf "%s\n" "Subject in the first line" "Line one in the body of message" "Line two in the body of message"  | { read -r subject; nail -s "$subject" joe@localhost; }
于 2013-01-02T12:00:53.360 回答
1

tail丢弃最后一行之前的行。您可以使用临时文件,或者将主题放在第一位而不是最后一位。无论哪种方式,如果没有合作程序 la ,管道就无法同时消耗和保持一条线tee

#!/bin/sh
# use first line as subject, args are recipients
# stdin is message body
read subj
( echo "$subj"; cat ) | nail -s "$subj" "$@"
于 2013-01-02T11:41:01.740 回答