Collegamento di due comandi Bash
Domanda
Ho Ubuntu Linux. Ho trovato un comando che mi consentirà di scaricare gli argomenti dei messaggi non letti da 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 poi un altro comando per farmi inviare facilmente la posta (una volta installato il comando sendemail tramite 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 che durante la produzione probabilmente cambierò -v sopra con -q.)
Quindi, se un comando scarica oggetti di una riga, come posso inserirli nel comando sendEmail?
Ad esempio, ho provato a usare un carattere pipe tra i due, dove ho usato " $ 1 " dopo il parametro -m, ma quello che è successo è che quando non avevo e-mail non lette mi avrebbe comunque inviato almeno un messaggio vuoto.
Se mi aiuti in questo, userò queste informazioni per condividere su StackOverflow come creare un Gmail Notifier che si può collegare ai messaggi SMS sul proprio telefono.
Soluzione
Penso che se mescoli viraptor & amp; DigitalRoss 'risponde che ottieni quello che vuoi. Ho creato un test di esempio creando un file falso con il seguente input:
Contenuto del file:
foo
bar
baz
Quindi ho eseguito questo comando:
% cat ~/tmp/baz | while read x; do if [[ $x != "" ]]; then echo "x: '$x'"; fi; done
Questo stamperà solo le linee con input out. Non ho familiarità con sendEmail; ha bisogno che il corpo sia su stdin o puoi passarlo sulla cmdline?
Altri suggerimenti
Sai che puoi farlo direttamente in Gmail usando un filtro e il tuo gateway e-mail SMS, giusto?
Ma torniamo alla domanda ...
È possibile ottenere il controllo in uno script shell per l'output del comando con il seguente modello di progettazione:
command1 | while read a b c restofline; do
: execute commands here
: command2
done
Leggi inserisce la prima parola in a
, la seconda in b
e il resto della riga in restofline
. Se il ciclo è composto da un solo comando, il programma xargs
probabilmente farà esattamente quello che vuoi. Leggi in particolare il parametro -I
che ti consente di posizionare l'argomento sostituito ovunque nel comando.
A volte il ciclo sembra ... | mentre leggi x; do
, che mette l'intera riga in x
.
Prova questa struttura:
while read line
do
sendemailcommand ... -m $line ...
done < <(curlcommand)
Darei un'occhiata al comando xargs
, che fornisce tutte le funzionalità di cui hai bisogno (per quanto posso dire).
Forse qualcosa del genere:
curl_command > some_file
if [[ `wc -l some_file` != "0 some_file" ]] ; then
email_command < some_file
fi