1>/dev/null 2>&1
:
1 (stdout) : /dev/null
2 (stderr) : /dev/null
2>&1 1>/dev/null
:
1 (stdout) : /dev/null
2 (stderr) : destination originale de 1 (stdout)
L'ordre est important car ils sont traités de gauche à droite, en utilisant les valeurs actuelles des descripteurs à ce moment-là.
Regardons 1>/dev/null 2>&1
avec deux conditions de départ différentes :
Original After 1>/dev/null After 2>&1
----------------- ----------------- -----------------
1 (stdout): /dev/tty /dev/null /dev/null
2 (stderr): /dev/tty /dev/tty /dev/null
Original After 1>/dev/null After 2>&1
----------------- ----------------- -----------------
1 (stdout): /tmp/stdout /dev/null /dev/null
2 (stderr): /tmp/stderr /tmp/stderr /dev/null
Maintenant, regardons 2>&1 1>/dev/null
avec les mêmes conditions de départ.
Original After 2>&1 After 1>/dev/null
----------------- ----------------- -----------------
1 (stdout): /dev/tty /dev/tty /dev/null
2 (stderr): /dev/tty /dev/tty /dev/tty
Original After 2>&1 After 1>/dev/null
----------------- ----------------- -----------------
1 (stdout): /tmp/stdout /tmp/stdout /dev/null
2 (stderr): /tmp/stderr /tmp/stdout /tmp/stdout
Démo
a
:
#!/usr/bin/perl
print STDOUT "Sent to STDOUT\n";
print STDERR "Sent to STDERR\n";
$ ( exec 1>/tmp/stdout 2>/tmp/stderr; ./a )
$ cat /tmp/stdout; echo .
Sent to STDOUT
.
$ cat /tmp/stderr; echo .
Sent to STDERR
.
$ ( exec 1>/tmp/stdout 2>/tmp/stderr; ./a 2>&1 1>/dev/null )
$ cat /tmp/stdout; echo .
Sent to STDERR
.
$ cat /tmp/stderr; echo .
.
$ ( exec 1>/tmp/stdout 2>/tmp/stderr; ./a 1>/dev/null 2>&1 )
$ cat /tmp/stdout; echo .
.
$ cat /tmp/stderr; echo .
.
10 votes
Je décris
2>&1
comme "redirigé fd2 vers ce que fd1 utilise actuellement " -- par la suite, rediriger fd1 n'affecte pas ce que fd2 utilise.0 votes
Excellente question.