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 should work fine:
It will store all logs in file.txt as well as dump them on terminal.
In Bash you can also explicitly specify your redirects to different files:
Appending would be:
There are two ways to do this, depending on your Bash version.
The classic and portable (Bash pre-4) way is:
A nonportable way, starting with Bash 4 is
(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
Bash executes the redirects from left to right as follows:
>>file.txt
: Openfile.txt
in append mode and redirectstdout
there.2>&1
: Redirectstderr
to "wherestdout
is currently going". In this case, that is a file opened in append mode. In other words, the&1
reuses the file descriptor whichstdout
currently uses.In Bash 4 (as well as ZSH 4.3.11):
just out of box
Try this
Your usage of &>x.file does work in bash4. sorry for that : (
Here comes some additional tips.
0, 1, 2...9 are file descriptors in bash.
0 stands for
stdin
, 1 stands forstdout
, 2 stands forstderror
. 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