9

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?

2 Answers 2

12

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.

1
  • This little tip has been incredibly helpful. The ins & outs of built in commands/ special characters are scarcely documented. Thank you again.
    – njboot
    Commented Dec 22, 2014 at 4:28
4

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

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

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .