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