Creo que tendrá que usar un archivo temporal para esta operación para que pueda usar el &&
operador para ejecutar solo el comando de correo si el grep devolvió un estado de salida que dice que tenía coincidencias como esta:
TMPFILE=`mktemp /tmp/mailqgrep.XXXXXX`; mailq | egrep 'rejected|refused' -A5 -B5 > "$TMPFILE" && mail -s 'dd' email@email < "$TMPFILE"; rm "$TMPFILE"
Si no le importaba que el archivo temporal se quedara en algún lugar y puede usar un nombre estático para él, puede omitir las cosas especiales de nomenclatura y eliminación:
mailq | egrep 'rejected|refused' -A5 -B5 > /tmp/mailqgrep && mail -s 'dd' email@email < /tmp/mailqgrep
Editar: después de ver la respuesta de Glenn, jugué con esto un poco más y, aparentemente, asignar una variable usando la $()
sintaxis devuelve el código de salida del comando, por lo que puede omitir la prueba que utilizó para la longitud de la cadena y usarla en su lugar. Aquí está todo en un comando:
data=$(mailq | egrep 'rejected|refused' -A 5 -B 5) && mail -s 'dd' email@email <<< "$data"
Edición 2: después de ver la respuesta de Simon, revisé mi mail
programa. No se comporta de la manera que él describe de manera predeterminada, pero tiene una opción para eso. Desde la página del manual:
-E
Si un mensaje saliente no contiene ningún texto en su primera o única parte del mensaje, no lo envíe, deséchelo en silencio, configurando efectivamente la variable skipemptybody al inicio del programa. Esto es útil para enviar mensajes desde scripts iniciados por cron (8).
Haciendo esto posible:
mailq | egrep 'rejected|refused' -A 5 -B 5 | mail -E -s 'dd' email@email