Saving or Grouping Output from Several Commands
Problem
You want to capture the output with a redirect, but you’re typing several commands on one line.
$ pwd; ls; cd ../elsewhere; pwd; ls > /tmp/all.out
The final redirect applies only to the last command, the last ls on that line. All the other output appears on the screen (i.e., does not get redirected).
Solution
Use braces { } to group these commands together, then redirection applies to the output from all commands in the group. For example:
$ { pwd; ls; cd ../elsewhere; pwd; ls; } > /tmp/all.outWarning
There are two very subtle catches here. The braces are actually reserved words, so they must be surrounded by whitespace. Also, the trailing semicolon is required before the closing space.
Alternately, you could use parentheses () to tell bash to run the commands in a subshell, then redirect the output of the entire subshell’s execution. For example:
$ (pwd; ls; cd ../elsewhere; pwd; ls) > /tmp/all.out
Discussion
While these two solutions look very similar, there are two important differences. The first difference is syntactic, the second is semantic. Syntactically, the braces need to have white space around them and the last command inside the list must terminate with a semicolon. That’s not required when you use parentheses. The bigger difference, though, is semantic—what these constructs mean. The braces are just a way to group several commands together, more like a shorthand for our redirecting, so that we don’t have to redirect each ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access