Pergunta

Eu tenho Ubuntu Linux. Eu encontrei um comando vai me deixar baixar assuntos das mensagens não lidas a partir do 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"

... e depois outro comando para deixar-me enviar e-mails com facilidade (uma vez eu instalei o comando sendemail via 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

(Nota quando em produção eu provavelmente vou trocar -v acima com q.)

Assim, se um comando de downloads um indivíduos de linha, como eu posso tubo estes no comando sendEmail?

Por exemplo, eu tentei usar um caractere de pipe entre os dois, onde eu costumava "$ 1" após o parâmetro -m, mas o que aconteceu foi que, quando eu não tinha e-mails não lidos ainda iria enviar-me pelo menos uma mensagem vazia.

Se você me ajudar com isso, eu vou usar essas informações para compartilhar sobre StackOverflow como construir um Notifier Gmail que se pode ligar para mensagens SMS em seu telefone.

Foi útil?

Solução

Eu acho que se você misturar viraptor & DigitalRoss respostas você começa o que você quer. Eu criei um teste de amostra através da criação de um arquivo falso, com a entrada seguinte:

O conteúdo dos arquivos:

foo

bar

baz

Então eu corri este comando:

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

Isso só vai imprimir linhas com a entrada. Eu não estou familiarizado com sendEmail; Será que ela precisa do corpo para estar em stdin ou você pode passá-lo no cmdline?

Outras dicas

Você sabe que você pode fazer isso diretamente no Gmail usando um filtro e seu gateway de e-mail SMS, certo?

Mas voltando à pergunta ...

Você pode obter o controle em um shell script para saída de comando com o padrão de design seguinte:

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

Leia coloca a primeira palavra em a, o segundo em b, eo resto da linha em restofline. Se o ciclo é composto de apenas um único comando, o programa xargs provavelmente só irá fazer o que quiser. Leia em particular sobre o parâmetro -I que permite que você coloque a qualquer lugar argumento substituído no comando.

Às vezes os olhares de loop como ... | while read x; do, o que coloca a linha inteira em x.

Tente esta estrutura:

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

Eu olhava para o comando xargs, que fornece todas as características que você precisa (tanto quanto eu posso dizer).

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

Talvez algo como isto:

curl_command > some_file
if [[ `wc -l some_file` != "0 some_file" ]] ; then
  email_command < some_file
fi
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top