Соединение двух команд Bash - PullRequest
1 голос
/ 25 октября 2009

У меня 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-сообщениям на их телефоне.

Ответы [ 5 ]

1 голос
/ 08 ноября 2009

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

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

foo

bar

baz

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

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

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

1 голос
/ 25 октября 2009

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

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

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

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

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

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

1 голос
/ 25 октября 2009

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

while read line
do
    sendemailcommand ... -m $line ...
done < <(curlcommand)
0 голосов
/ 25 октября 2009

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

curl_command > some_file
if [[ `wc -l some_file` != "0 some_file" ]] ; then
  email_command < some_file
fi
0 голосов
/ 25 октября 2009

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

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

...