Я думаю, що вам доведеться використовувати тимчасовий файл для цієї операції, щоб ви могли використовувати &&
оператора лише для запуску команди пошти, якщо 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
Редагувати: Побачивши відповідь glenn, я пограв ще з цим і, мабуть, призначив змінну за допомогою $()
синтаксису, повертає код виходу команди, тож ви можете пропустити тест, який він використовував для довжини рядка, і використовувати його замість цього. Ось це все в одній команді:
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