For background:
- a number 1 = standard out (i.e. STDOUT)
- a number 2 = standard error (i.e. STDERR)
- if a number isn't explicitly given, then number 1 is assumed by the shell (bash)
First let's tackle the function of these. For reference see the .
Functions
2>&-
The general form of this one is M>&-
, where "M" is a file descriptor number. This will close output for whichever file descriptor is referenced, i.e. "M".
2>/dev/null
The general form of this one is M>/dev/null
, where "M" is a file descriptor number. This will redirect the file descriptor, "M", to /dev/null
.
2>&1
The general form of this one is M>&N
, where "M" & "N" are file descriptor numbers. It combines the output of file descriptors "M" and "N" into a single stream.
|&
This is just an abbreviation for 2>&1
. It was added in Bash 4.
&>/dev/null
This is just an abbreviation for 2>&1 >/dev/null
. It too was added in Bash 4. It redirects file descriptor 2 (STDERR) and descriptor 1 (STDOUT) to /dev/null
.
>/dev/null
This is just an abbreviation for 1>/dev/null
. It redirects file descriptor 1 (STDOUT) to /dev/null
.
Portability to non-bash, tcsh, mksh, etc.
I've not dealt much with other shells outside of csh
and tcsh
. My experience with those 2 compared to bash's redirection operators, is that bash is superior in that regard. See the for more details.
Of the commands you asked about none are directly supported by csh/tcsh. You'd have to use different syntaxes to construct similar functions.
&>
for GNU bash compatibility, it’s strongly encouraged to not use this, as parsing it can break the semantics of existing POSIX scripts, and mksh disables that in POSIX mode already. –