construcción de tubería bash para anteponer algo a la salida estándar del comando anterior

25

Quiero usar sendmail para enviarme cosas y quiero hacerlo en línea.

echo "mail content" | sendmail emailataddres.com 

Lo envía sin tema.

La línea de asunto debe aparecer antes del contenido del Correo, por lo que busco algo similar a:

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

sed y awk tienden a ser realmente incómodos de usar y recordar.

EDITAR : Solo para aclarar: echo "Contenido de correo" es solo un ejemplo ilustrativo. Necesito poder anteponer cosas a las secuencias estándar de cualquier fuente. por ejemplo: ifconfig, zcat, etc.

AndreasT
fuente
echo -e "Subject: All that matters\nmail content"? O más independiente de la plataforma: printf 'Subject: %s\n%s\n' "All that matters" "mail content". También podría escribir un pequeño script que solo tome los dos argumentos de cadena para hacer una línea más simple.
Daniel Andersson el
Bueno, si agregas esto como respuesta, podría aceptarlo ... :)
AndreasT
Ah, no, no lo siento. Por favor, mira mi edición.
AndreasT el
Que debe prependhacer Para saber cómo anteponer algo, debe esperar hasta que el comando ascendente (p echo. Ej. ) Envíe el EOF, para que pueda insertar sus datos delante de él en el flujo antes de pasarlo a stdout para que se canalice a sendmail. Suena como una tarea para un script corto de Ruby o Python.
Allquixotic
1
Un enfoque ligeramente diferente sería usar el mailcomando (a veces llamado bsdmail) en lugar de hacerlo sendmaildirectamente. mailtoma una -s subjectopción opcional , por ejemplo: ifconfig -a | mail -s 'Current ifconfig output' [email protected]
Wim Lewis

Respuestas:

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

Estoy bastante seguro de que hay una mejor solución, pero esto debería funcionar.

Claudio
fuente
1
Simple, funcional y demostrado. +1
Hennes
¿Hay una manera fácil de hacerlo sin el retorno de descanso?
VenomFangs
2
@VenomFangs Use en printflugar del segundo echoy debería estar bien
Trendfischer
> ¿Hay una manera fácil de hacerlo sin el retorno de descanso? -echo -n
kyb
6

Utilice lo que dijo Claudio o haga el suyo:

~ / bin / prepend:

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

p.ej:

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

Subject: Venetian Snares
Splendid SUPANINJA! Lets do it!

Ярослав Рахматуллин
fuente
6

Esto está inspirado en la respuesta de Claudio.

Si no desea un retorno de descanso entre sus salidas, agregue el -nparámetro. Esto se verá así:

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

Lo que dará:

21

VenomFangs
fuente
1
En realidad, no, no lo hará. Da "2 \ n1". Debe adjuntar el "-n" al segundo eco. Todavía +1. Si corrige eso, podría aceptarlo. No estoy seguro de lo que es justo, ya que Claudio contribuyó más a la solución.
AndreasT
Lo siento, creo que puse el -nlugar equivocado. De todos modos, la actualización debería dar "21 \ n" si desea deshacerse de la \ n luego agregue un -n antes del 1.
VenomFangs
1

De las piezas que he reunido ... podrías hacer algo como esto:

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

Tenga en cuenta que no cerré las comillas en la primera línea ... porque no todos los shells traducen el carácter \na una nueva línea ... pero todavía tengo que encontrar uno que no procese una nueva línea real dentro de las comillas.

Cuando un comando está encerrado en el carácter `, se ejecutará y la salida se inyectará en el lugar. Tenga en cuenta que este código es un poco peligroso ya que es posible inyectar comandos adicionales en línea que podrían comprometer fácilmente su sistema ...

**** editar **** Siguiendo los consejos de Claudio, una opción más limpia se vería así:

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

Incluso con esa plantilla, podría ser explotada.

TheCompWiz
fuente
1
Por lo general, es más agradable de usar $()que `` ya que se supone que es más portátil (y también más legible). Además, puede usar echola -eopción '' para hacer que traduzca nuevas líneas ( echo -e "1\n2") o simplemente use printf como lo sugiere Daniel en el primer comentario.
Claudio el
Inmediatamente después de publicar mi respuesta ... leo la tuya y me gusta más. Buenos puntos.
TheCompWiz
0

Puede anteponer la salida canalizada mediante la sustitución del proceso :

$ echo "mail content" | cat <(echo "Subject: All that matters") -
Subject: All that matters
mail content
aparkerlue
fuente