Anschließen von zwei Bash-Befehle
Frage
Ich habe Ubuntu Linux. Ich fand einen Befehl lässt mich ungelesene Nachricht Themen von Google Mail heruntergeladen werden:
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"
... und dann ein anderer Befehl mir Mail leicht senden lassen (wenn ich der Sendemail-Befehl über apt-get installiert ist):
sendEmail -f EMAIL@DOMAIN.COM -v -t PHONE@SMS.COM -u Gmail Notifier -m test -s MAILSERVER:PORT -xu EMAIL@DOMAIN.COM -xp PASSWORD
(Beachten Sie, wenn in der Produktion werde ich wahrscheinlich mit -q tauschen -v oben.)
Also, wenn ein Befehl lädt eine Zeile Themen, wie kann ich Rohr diese in den sendemail Befehl?
Zum Beispiel habe ich versucht, ein Pipe-Zeichen zwischen den beiden mit, wo ich „$ 1“ nach dem Parameter -m verwendet, aber was passiert war, dass, wenn ich keine ungelesenen E-Mails hätte es mindestens eine leere Nachricht senden Sie mir noch.
Wenn Sie mir dabei helfen, werde ich diese Informationen benutzen, auf Stackoverflow zu teilen, wie ein Google Mail Notifier zu bauen, dass man SMS-Nachrichten auf ihrem Handy anschließen können.
Lösung
Ich denke, wenn man viraptor & DigitalRoss' Antworten, die Sie mischen, was Sie wollen. Ich habe einen Probe-Test durch eine gefälschte Datei mit folgenden Eingabe zu erstellen:
Datei-Inhalt:
foo
bar
baz
Dann lief ich diesen Befehl ein:
% cat ~/tmp/baz | while read x; do if [[ $x != "" ]]; then echo "x: '$x'"; fi; done
Dies wird nur Druckzeilen mit Eingabe aus. Ich bin nicht vertraut mit sendemail; ist es, den Körper muß auf stdin sein oder können Sie es auf dem cmdline passieren?
Andere Tipps
Sie wissen Sie, dass direkt in gmail unter Verwendung eines Filters und SMS-E-Mail-Gateway tun, nicht wahr?
Aber zurück zur Frage ...
Sie können die Kontrolle in einem Shell-Skript für Befehlsausgabe mit dem folgende Design-Muster erhalten:
command1 | while read a b c restofline; do
: execute commands here
: command2
done
Lesen Sie legt das erste Wort in a
, die zweite in b
, und den Rest der Linie in restofline
. Wenn die Schleife besteht aus nur einem einzigen Befehl, wird das xargs
Programm wahrscheinlich nur das tun, was Sie wollen. Lesen Sie insbesondere über die -I
Parameter, die Sie das substituierte Argument überall in dem Befehl platzieren können.
Manchmal sieht die Schleife wie ... | while read x; do
, die die gesamte Linie in x
setzt.
Versuchen Sie, diese Struktur:
while read line
do
sendemailcommand ... -m $line ...
done < <(curlcommand)
würde ich am xargs
Befehl suchen, die die Eigenschaften alles, was Sie (soweit ich das beurteilen kann) müssen zur Verfügung stellt.
Vielleicht so etwas wie folgt aus:
curl_command > some_file
if [[ `wc -l some_file` != "0 some_file" ]] ; then
email_command < some_file
fi