Piping multiple commands

I would like to run the following command and pipe stout of both to TextEdit:

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

This doesn't work, it only executes the latter:

How?


Aahhh, bash redirection :-

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

That runs your commands as a single bash command (that's the effect of &&) in a sub-shell (which is what wrapping it in the () does) and redirects the output of the sub-shell into TextEdit for you. You technically don't have to use && instead of ; but the effect of changing it is that if any of the commands fail it will stop the entire chain at that point.

Note: In your example all the commands are being run (as you can prove by just running pmset -g; echo; pmset -g assertions at the command line), it's just that you are applying the pipe to only the last one. That's why it needs to be run in a subshell.

Note: that you could replace the | character with > and send the output to a file if you wish.


()'s combine the commands into a single process, concatenating them to stdout:

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