How to redirect stdout/stderr to file?
- 2020-2-28
One common pattern that you perhaps saw before is using 2>&1
, which means redirect stderr
to stdout
. Combined with it, we can use >
or >>
to redirect both stdout/stderr
to some file.
1 | command 2>&1 > file # or commmand 2>&1 >> file |
Note: the different between >
and >>
is that >
will overwrite the previous content of the file and >>
will append the text at the bottom of the previous file.
&>
The bash 4 gives you another option to finish the same task as we described before:
1 | command &> file |
The above command will redirect both stdout
and stderr
to a file.
Writes output both to the screen and a file
Sometimes we'd like to write the stdout/stderr
to some file and keep the output on the screen at the time. What should we do in this situation?
One useful command that helps us to do this task is the tee
. The tee
command writes the output to the screen (stdout/stderr) and to the file in the meanwhile. For example:
1 | date | tee file |
The above command will print the current date on the scrren and save it the file.
One common need that we want to achieve is print the original output of the command to the screen and do some operations (for instance, we pass it as input to the sed
to do the substitution).
The below example will writes the output of the first command and remove the color codes (eg. [39m) using sed
and then save the substituted one to the file:
1 | command 2>&1 | tee /dev/stderr | gsed -ur 's/\x1B\[([0-9]{1,3}(;[0-9]{1,2})?)?[mGK]//g;' &> ~/.log |
PS: The native sed
command in the BSD systems (eg. MacOS) do not support -u
option, which will force the output to be line buffered. A more detailed explanation of this option is appended below:
sed -u: Force output to be line buffered, printing each line as it becomes available. By default, output is line buffered when standard output is a terminal and block buffered otherwise. See setbuf(3) for a more detailed explanation.
PSS: -r
option of sed
is aimed to use extended regular expression syntax.