Conectando dois comandos Bash
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.
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).
Talvez algo como isto:
curl_command > some_file
if [[ `wc -l some_file` != "0 some_file" ]] ; then
email_command < some_file
fi