Я думаю, что вам нужно будет использовать временный файл для этой операции, чтобы вы могли использовать &&
оператор для запуска почтовой команды только в том случае, если grep вернул состояние выхода, которое говорит, что совпадения были такими:
TMPFILE=`mktemp /tmp/mailqgrep.XXXXXX`; mailq | egrep 'rejected|refused' -A5 -B5 > "$TMPFILE" && mail -s 'dd' email@email < "$TMPFILE"; rm "$TMPFILE"
Если вы не возражаете против того, чтобы временный файл где-то торчал, и можете использовать для него статическое имя, вы можете пропустить специальную функцию именования и удаления:
mailq | egrep 'rejected|refused' -A5 -B5 > /tmp/mailqgrep && mail -s 'dd' email@email < /tmp/mailqgrep
Изменить: После просмотра ответа Гленна я поиграл с этим еще немного и, видимо, присвоение переменной с использованием $()
синтаксиса возвращает код завершения команды, так что вы можете пропустить тест, который он использовал для длины строки, и использовать его вместо этого. Вот это все в одной команде:
data=$(mailq | egrep 'rejected|refused' -A 5 -B 5) && mail -s 'dd' email@email <<< "$data"
Изменить 2: увидев ответ Саймона, я проверил свою mail
программу. Он не ведет себя так, как он описывает по умолчанию, но имеет возможность для этого. Со страницы руководства:
-E
Если исходящее сообщение не содержит никакого текста в своей первой или единственной части сообщения, не отправляйте его, а отбрасывайте его молча, эффективно устанавливая переменную skipemptybody при запуске программы. Это полезно для отправки сообщений из скриптов, запускаемых cron (8).
Делая это возможным:
mailq | egrep 'rejected|refused' -A 5 -B 5 | mail -E -s 'dd' email@email