Вопрос

У меня Ubuntu Linux. Я обнаружил, что одна команда позволит мне загружать непрочитанные темы сообщений из Gmail:

curl -u USERNAME:PASSWORD --silent "https://mail.google.com/mail/feed/atom" | tr -d '\n' | awk -F '<entry>' '{for (i=2; i<=NF; i++) {print $i}}' | sed -n "s/<title>\(.*\)<\/title.*name>\(.*\)<\/name>.*/\2 - \1/p"

... а затем еще одна команда, позволяющая легко отправлять почту (как только я установил команду sendemail через apt-get):

sendEmail -f EMAIL@DOMAIN.COM -v -t PHONE@SMS.COM -u Gmail Notifier -m test -s MAILSERVER:PORT -xu EMAIL@DOMAIN.COM -xp PASSWORD

(обратите внимание, когда я буду в производстве, я, вероятно, заменим -v выше на -q.)

Итак, если одна команда загружает однострочные темы, как я могу передать их в команду sendEmail?

Например, я попытался использовать символ канала между ними, где я использовал " $ 1 " после параметра -m, но случилось так, что, когда у меня не было непрочитанных писем, оно все равно отправляло бы мне хотя бы одно пустое сообщение.

Если вы поможете мне с этим, я воспользуюсь этой информацией, чтобы поделиться в StackOverflow, как создать Gmail Notifier, который можно подключать к SMS-сообщениям на их телефоне.

Это было полезно?

Решение

Я думаю, что если вы смешаете viraptor & amp; DigitalRoss 'отвечает, вы получаете то, что вы хотите. Я создал образец теста, создав поддельный файл со следующим вводом:

Содержимое файла:

foo

bar

baz

Затем я запустил эту команду:

% cat ~/tmp/baz | while read x; do if [[ $x != "" ]]; then echo "x: '$x'"; fi; done

Это будет печатать только строки с выходом. Я не знаком с sendEmail; нужно ли, чтобы тело находилось на stdin, или вы можете передать его по cmdline?

Другие советы

Вы знаете, что вы можете сделать это прямо в Gmail, используя фильтр и свой почтовый шлюз SMS, верно?

Но вернемся к вопросу ...

Вы можете получить управление в сценарии оболочки для вывода команды со следующим шаблоном проектирования:

command1 | while read a b c restofline; do
    : execute commands here
    : command2
done

При чтении первое слово помещается в a , второе - в b , а остальная часть строки - в restofline . Если цикл состоит только из одной команды, программа xargs , вероятно, просто сделает то, что вы хотите. В частности, прочитайте о параметре -I , который позволяет разместить замещенный аргумент в любом месте команды.

Иногда цикл выглядит как ... | пока читаю х; do , который помещает всю строку в x .

Попробуйте эту структуру:

while read line
do
    sendemailcommand ... -m $line ...
done < <(curlcommand)

Я бы посмотрел на команду xargs , которая предоставляет все необходимые вам функции (насколько я могу судить).

http://unixhelp.ed.ac.uk/CGI/man -cgi? xargs

Может быть, что-то вроде этого:

curl_command > some_file
if [[ `wc -l some_file` != "0 some_file" ]] ; then
  email_command < some_file
fi
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top