Conectando dos comandos de Bash
Pregunta
Tengo Ubuntu Linux. Encontré que un comando me permite descargar temas de mensajes no leídos desde Gmail:
curl -u USERNAME:PASSWORD --silent "https://mail.google.com/mail/feed/atom" | tr -d '\n' | awk -F '<entry>' '{for (i=2; i<=NF; i++) {print $i}}' | sed -n "s/<title>\(.*\)<\/title.*name>\(.*\)<\/name>.*/\2 - \1/p"
... y luego otro comando que me permita enviar correo fácilmente (una vez que instalé el comando sendemail mediante apt-get):
sendEmail -f EMAIL@DOMAIN.COM -v -t PHONE@SMS.COM -u Gmail Notifier -m test -s MAILSERVER:PORT -xu EMAIL@DOMAIN.COM -xp PASSWORD
(Tenga en cuenta que cuando esté en producción probablemente intercambiaré -v arriba con -q.)
Entonces, si un comando descarga una línea de temas, ¿cómo puedo canalizar estos en el comando sendEmail?
Por ejemplo, intenté usar un carácter de canalización entre los dos, donde usé " $ 1 " después del parámetro -m, pero lo que sucedió fue que cuando no tenía correos electrónicos no leídos, todavía me enviaría al menos un mensaje vacío.
Si me ayudas con esto, usaré esta información para compartir en StackOverflow cómo crear un Notificador de Gmail para que puedas conectarte a los mensajes SMS en su teléfono.
Solución
Creo que si mezclas viraptor & amp; Las respuestas de DigitalRoss te dan lo que quieres. Creé una prueba de muestra creando un archivo falso con la siguiente entrada:
Contenido del archivo:
foo
bar
baz
Luego ejecuté este comando:
% cat ~/tmp/baz | while read x; do if [[ $x != "" ]]; then echo "x: '$x'"; fi; done
Esto solo imprimirá líneas con entrada. No estoy familiarizado con enviar correo electrónico; ¿Necesita el cuerpo para estar en stdin o puedes pasarlo en el cmdline?
Otros consejos
Sabes que puedes hacerlo directamente en gmail utilizando un filtro y tu puerta de enlace de correo electrónico SMS, ¿no?
Pero volviendo a la pregunta ...
Puede obtener el control en un script de shell para la salida del comando con el siguiente patrón de diseño:
command1 | while read a b c restofline; do
: execute commands here
: command2
done
Leer coloca la primera palabra en a
, la segunda en b
y el resto de la línea en restofline
. Si el bucle consta de un solo comando, el programa xargs
probablemente solo hará lo que usted desea. Lea en particular sobre el parámetro -I
que le permite colocar el argumento sustituido en cualquier parte del comando.
A veces el bucle se parece a ... | mientras lee x; do
, que coloca la línea completa en x
.
Prueba esta estructura:
while read line
do
sendemailcommand ... -m $line ...
done < <(curlcommand)
Miraría el comando xargs
, que proporciona todas las funciones que necesitas (hasta donde puedo decir).
Tal vez algo como esto:
curl_command > some_file
if [[ `wc -l some_file` != "0 some_file" ]] ; then
email_command < some_file
fi