Соединение двух команд Bash
Вопрос
У меня 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
, которая предоставляет все необходимые вам функции (насколько я могу судить).
Может быть, что-то вроде этого:
curl_command > some_file
if [[ `wc -l some_file` != "0 some_file" ]] ; then
email_command < some_file
fi