bash pipe construct para acrescentar algo ao stdoutput do comando anterior

14

Eu quero usar o sendmail para me mandar coisas e querer fazer isso em um oneliner.

echo "mail content" | sendmail emailataddres.com 

Envia sem assunto.

A linha de assunto deve vir antes do conteúdo do Mail, então estou procurando por algo do tipo:

echo "mail content" | prepend "Subject: All that matters" | sendmail emailataddres.com 

sed e awk tendem a ser muito difíceis de usar e lembrar.

EDIT : Só para esclarecer: echo "Mail content" é apenas um exemplo ilustrativo. Eu preciso ser capaz de prefixar o material em fluxos stdout de qualquer origem. por exemplo: ifconfig, zcat, etc.

    
por AndreasT 13.11.2012 / 16:54

4 respostas

32

$ echo 1 | (echo 2 && cat)
2
1

Tenho certeza de que existe uma solução melhor, mas isso deve ser feito.

    
por 13.11.2012 / 17:51
4

Use o que o Claudius disse ou faça o seu próprio:

~ / bin / prepend:

#!/bin/sh
echo -en "$@"
cat -

por exemplo:

$ echo "Splendid SUPANINJA! Let's do it!" |\
     prepend "Subject: Venetian Snares\n"

Subject: Venetian Snares
Splendid SUPANINJA! Lets do it!

    
por 19.11.2012 / 05:39
4

Isso é inspirado pela resposta de Claudius.

Se você não quiser um intervalo entre as suas saídas, adicione o -n param. Isso será parecido com:

$ echo 1 | (echo -n 2 && cat)

O que dará:

21

    
por 21.07.2015 / 18:21
1

Das peças que eu juntei ... você poderia fazer algo assim:

echo "Subject: All that matters
'echo "mail content"'" | sendmail blah@blahblah

Observe que eu não fechei as aspas na primeira linha ... porque nem todas as shells traduzem o \n em um caractere de nova linha ... mas ainda não encontrei uma que não processe uma nova linha real dentro das citações .

Quando um comando é colocado no caractere ', ele será executado e a saída será injetada no local. Tenha em mente que esse código é um pouco perigoso, já que é possível injetar comandos adicionais em linha que poderiam facilmente comprometer seu sistema ...

**** edit **** Seguindo o conselho de Claudius, uma opção mais limpa ficaria assim:

echo -e "Subject: All that matters \n $(echo "mail content") |sendmail blah@blahblah

Mesmo com esse modelo, ele pode ser explorado.

    
por 13.11.2012 / 17:54