I was a little confused by this expression:

gcc -c -g program.c >& compiler.txt

I know &>filename will redirect both stdout and stderr to file filename. But in this case the ampersand is after the greater than sign. It looks like its of the form M>&N, where M and N are file descriptors.

In the snippet above, does M=1 and N='compiler.txt'? How exactly is this different from:

gcc -c -g program.c > compiler.txt     (ampersand removed)

My understanding is that each open file is associated with a file descriptor greater than 2. Is this correct?

If so, is a file name interchangeable with its file descriptor as the target of redirection?


This is the same as &>. From the bash manpage:

Redirecting Standard Output and Standard Error This construct allows both the standard output (file descriptor 1) and the standard error output (file descriptor 2) to be redirected to the file whose name is the expansion of word.

There are two formats for  redirecting  standard  output  and  standard
error:

       &>word
and
       >&word

Of the two forms, the first is preferred.  This is semantically equiva-
lent to

       >word 2>&1

&> vs >&: the preferred version is &> (clobber)

Regarding:

  • &>
  • >&

both will clobber the file - truncate it file to 0 bytes before writing to it, just like > file would do in the STDIN-only case.

However, the bash manual Redirections section adds that:

Of the two forms, the first is preferred. This is semantically equivalent to

>word 2>&1

When using the second form, word may not expand to a number or -. If it does, other redirection operators apply (see Duplicating File Descriptors below) for compatibility reasons.

(Note: in zsh both are equivalent.)

It's very good practice to get finger memory in the first (&>) form, because:

Use &>> as >>& is not supprted by bash (append)

There's only one append form:

The format for appending standard output and standard error is:

&>>word

This is semantically equivalent to

>>word 2>&1

(see Duplicating File Descriptors below).

Note:

  • The clobber usage of &> over >& in the section above is again recommended given there is only one way for appending in bash.
  • zsh allows both &>> and >>& forms.