Mehrere Befehle weiterleiten

8

Ich möchte den folgenden Befehl und Pipe Stout von beiden zu TextEdit ausführen:

pmset -g; echo; pmset -g assertions | open -f -a TextEdit 

Dies funktioniert nicht, es führt nur letzteres aus:

Wie?

njboot
quelle

Antworten:

11

Aahhh, bashWeiterleitung: -

( pmset -g && echo && pmset -g assertions ) | open -f -a TextEdit

Dadurch werden Ihre Befehle als einzelner Bash-Befehl (das ist der Effekt von &&) in einer Sub-Shell ausgeführt (was das ist, was in die ()Do-Funktion eingeschlossen wird) und die Ausgabe der Sub-Shell für Sie in TextEdit umgeleitet. Sie technisch müssen nicht verwendet werden, &&anstatt ;aber die Wirkung , die sie der Änderung ist , dass , wenn eine der Befehle fehlschlagen wird , die gesamte Kette an diesem Punkt zu stoppen.

Hinweis: In Ihrem Beispiel werden alle Befehle ausgeführt (wie Sie anhand pmset -g; echo; pmset -g assertionsder Befehlszeile beweisen können ). Sie wenden die Pipe nur auf den letzten an. Deshalb muss es in einer Subshell ausgeführt werden.

Hinweis: Sie können das |Zeichen durch ersetzen >und die Ausgabe an eine Datei senden, wenn Sie dies wünschen.

Tony Williams
quelle
Dieser kleine Tipp war unglaublich hilfreich. Die Vor- und Nachteile eingebauter Befehle / Sonderzeichen sind kaum dokumentiert. Danke nochmal.
njboot
4

() kombinieren die Befehle zu einem einzigen Prozess und verketten sie zu stdout:

(pmset -g; echo; pmset -g assertions) | open -f -a TextEdit
l'L'l
quelle