Как я могу переписать эту команду только для электронной почты, если есть выход из mailq | grep
?
mailq | egrep 'rejected|refused' -A 5 -B 5 | mail -s 'dd' email@email
Это возможно даже на одной линии?
См. Проверка, пуст ли канал и запустите команду для данных, если это не для более общего случая, чем отправка электронной почты.
Ответы:
Я думаю, что вам нужно будет использовать временный файл для этой операции, чтобы вы могли использовать
&&
оператор для запуска почтовой команды только в том случае, если grep вернул состояние выхода, которое говорит, что совпадения были такими:Если вы не возражаете против того, чтобы временный файл где-то торчал, и можете использовать для него статическое имя, вы можете пропустить специальную функцию именования и удаления:
Изменить: После просмотра ответа Гленна я поиграл с этим еще немного и, видимо, присвоение переменной с использованием
$()
синтаксиса возвращает код завершения команды, так что вы можете пропустить тест, который он использовал для длины строки, и использовать его вместо этого. Вот это все в одной команде:Изменить 2: увидев ответ Саймона, я проверил свою
mail
программу. Он не ведет себя так, как он описывает по умолчанию, но имеет возможность для этого. Со страницы руководства:Делая это возможным:
источник
mktemp
не возвращают то, что нужно в кавычках.glob(split(var))
. Вам не нужно разделять слова или расширять глобусы файлов, поэтому не спрашивайте их. Также нам нужно показать правильный путь на этом сайте .zsh
и на самом деле не получаю ссор или расщепления слов в подобных случаях, если только я не прошу их, но ради ответов здесь и незнания целевой среды цитирование из принципа - это нормально.Утилита ifne существует специально для этой цели: запустить команду, если стандартный ввод не пустой.
Команда ifne является частью пакета moreutils , объявленного «растущей коллекцией инструментов Unix, о которой никто не думал писать давно, когда Unix был молодым».
источник
Вы можете сохранить выходные данные в переменной, а затем вызвать команду mail, если длина строки не равна нулю.
В одну строку соедините две команды точкой с запятой.
источник
Используйте
mail
с-E
опцией. На моем Mac MAIL (1) говорит, что-E
флаг не будет отправлять электронную почту с пустым телом.На моем Mac я провел следующий тест. Обратите внимание, что файл
file_does_exist
существует, но файлfile_does__not_exist
не существует.Это отправляет мне электронное письмо:
Это не так. Обратите внимание, что команда
ls file_does_not_exist | egrep ...
не производит никаких выходных данных.источник
В этом конкретном случае, если вы
mail
поддерживаете-E
опцию , просто используйте ее. В общем случае вы можете попытаться прочитать один символ; если он есть, запустите команду постобработки и передайте ему этот символ из остальной части файла.Обратите внимание на полезное использование
cat
. Добавлениеecho .
заставляет эту функцию работать, даже если первый символ во вводе является новой строкой (помните, что$(…)
конструкция удаляет новые строки терминала).В большинстве оболочек (насколько мне известно, кроме zsh), если файл начинается с нулевого символа, этот код будет считать его пустым. Исправление оставлено в качестве упражнения для читателя. (Подсказка: используйте
od
в первой подоболочке иprintf
напечатайте первый байт.) (Решение: Как проверить, пуст ли канал ). Вы можете столкнуться с той же проблемой, если файл начинается с байта, который не является допустимым символом в текущем локали; это легче исправить, запустив этот код сLC_ALL=C
.источник
read
помощь помочь упростить это?read
переносимого sh (это может быть возможно в bash, ksh или zsh).IIRC команда BSD
mail
прерывается, если дано пустое сообщение.источник
-E
параметр , чтобы включить его .Недавно я узнал об имени команды,
ifne
которая является частьюmoreutils
пакета. Где вы можете использовать его для решения этой конкретной проблемы.пример из справочной страницы,
источник
Вы можете переписать свою команду, используя,
test -s /dev/stdin
чтобы проверить, есть ли какие-либо выходные данные изmailq | grep
детали.источник