To redirect stdout to a truncated file in Bash, I know to use:
cmd > file.txt
To redirect stdout in Bash, appending to a file, I know to use:
cmd >> file.txt
To redirect both stdout and stderr to a truncated file, I know to use:
cmd &> file.txt
How do I redirect both stdout and stderr appending to a file? cmd &>> file.txt
did not work for me.
This question is related to
bash
append
stdout
io-redirection
stderr
In Bash you can also explicitly specify your redirects to different files:
cmd >log.out 2>log_error.out
Appending would be:
cmd >>log.out 2>>log_error.out
This should work fine:
your_command 2>&1 | tee -a file.txt
It will store all logs in file.txt as well as dump them on terminal.
There are two ways to do this, depending on your Bash version.
The classic and portable (Bash pre-4) way is:
cmd >> outfile 2>&1
A nonportable way, starting with Bash 4 is
cmd &>> outfile
(analog to &> outfile
)
For good coding style, you should
If your script already starts with #!/bin/sh
(no matter if intended or not), then the Bash 4 solution, and in general any Bash-specific code, is not the way to go.
Also remember that Bash 4 &>>
is just shorter syntax — it does not introduce any new functionality or anything like that.
The syntax is (beside other redirection syntax) described here: http://bash-hackers.org/wiki/doku.php/syntax/redirection#appending_redirected_output_and_error_output
In Bash 4 (as well as ZSH 4.3.11):
cmd &>>outfile
just out of box
Try this
You_command 1>output.log 2>&1
Your usage of &>x.file does work in bash4. sorry for that : (
0, 1, 2...9 are file descriptors in bash.
0 stands for stdin
, 1 stands for stdout
, 2 stands for stderror
. 3~9 is spare for any other temporary usage.
Any file descriptor can be redirected to other file descriptor or file by using operator >
or >>
(append).
Usage: <file_descriptor> > <filename | &file_descriptor>
Please reference to http://www.tldp.org/LDP/abs/html/io-redirection.html
I am surprised that in almost ten years, no one has posted this approach yet:
If using older versions of bash where &>>
isn't available, you also can do:
(cmd 2>&1) >> file.txt
This spawns a subshell, so it's less efficient than the traditional approach of cmd >> file.txt 2>&1
, and it consequently won't work for commands that need to modify the current shell (e.g. cd
, pushd
), but this approach feels more natural and understandable to me:
Also, the parentheses remove any ambiguity of order, especially if you want to pipe stdout and stderr to another command instead.
Edit: To avoid starting a subshell, you instead could use curly braces instead of parentheses to create a group command:
{ cmd 2>&1; } >> file.txt
(Note that a semicolon (or newline) is required to terminate the group command.)
Source: Stackoverflow.com