Eu acho que você terá que usar um arquivo temporário para esta operação, para que você possa usar o &&
operador para executar apenas o comando mail se o grep retornou um status de saída que diz ter correspondências como esta:
TMPFILE=`mktemp /tmp/mailqgrep.XXXXXX`; mailq | egrep 'rejected|refused' -A5 -B5 > "$TMPFILE" && mail -s 'dd' email@email < "$TMPFILE"; rm "$TMPFILE"
Se você não se importou com o arquivo temporário em algum lugar e pode usar um nome estático para ele, pule as coisas especiais de nomeação e exclusão:
mailq | egrep 'rejected|refused' -A5 -B5 > /tmp/mailqgrep && mail -s 'dd' email@email < /tmp/mailqgrep
Edit: Depois de ver a resposta de Glenn, eu brinquei mais com isso e, aparentemente, atribuir uma variável usando a $()
sintaxe retorna o código de saída do comando, para que você possa pular o teste que ele usou para o comprimento da string e usá-lo. Aqui está tudo em um comando:
data=$(mailq | egrep 'rejected|refused' -A 5 -B 5) && mail -s 'dd' email@email <<< "$data"
Edit 2: Depois de ver a resposta de Simon, verifiquei meu mail
programa. Ele não se comporta da maneira que ele descreve por padrão, mas tem uma opção para isso. Na página do manual:
-E
Se uma mensagem de saída não contiver texto na primeira ou única parte da mensagem, não a envie, mas a descarte silenciosamente, configurando efetivamente a variável skipemptybody na inicialização do programa. Isso é útil para enviar mensagens de scripts iniciados por cron (8).
Tornando isso possível:
mailq | egrep 'rejected|refused' -A 5 -B 5 | mail -E -s 'dd' email@email