Eu acho que você terá que usar um arquivo temporário para esta operação, para que você possa usar o operador &&
para executar somente o comando mail se o grep retornou um status de saída que diz que ele tinha correspondências assim:
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, pode ignorar o material especial de nomeação e exclusão:
mailq | egrep 'rejected|refused' -A5 -B5 > /tmp/mailqgrep && mail -s 'dd' email@email < /tmp/mailqgrep
Editar: depois de ver resposta de glenn Eu joguei com isso um pouco mais e, aparentemente, atribuindo uma variável usando a sintaxe $()
retorna o código de saída do comando , então você pode pular o teste que ele usou para o tamanho da string e usá-lo. Aqui está tudo em um só comando:
data=$(mailq | egrep 'rejected|refused' -A 5 -B 5) && mail -s 'dd' email@email <<< "$data"
Editar 2: Depois de ver resposta de Simon eu verifiquei o meu programa mail
. Ele não se comporta da maneira que ele descreve por padrão, mas tem uma opção para isso. Na página man:
-E
If an outgoing message does not contain any text in its first or only message part, do not send it but discard it silently, effectively setting skipemptybody variable at program startup. This is useful for sending messages from scripts started by cron(8).
Tornando isso possível:
mailq | egrep 'rejected|refused' -A 5 -B 5 | mail -E -s 'dd' email@email