Original URL: http://blog.chinaunix.net/uid-25909722-id-2912890.html
Transferred from: http://blog.chinaunix.net/space.php?uid=7589639&do=blog&id=2897930
a.out > outfile 2>&1 redirection issues under Linux
The problem stems from the UNIX advanced environment programming
a.out > OutFile 2>&1
A.out 2> &1 >outfile
1. First 1> can be abbreviated to >, followed by 1 for stdout, output for the terminal, 2 for stderr, I also feel on the terminal. in front of 1 plus & is to show that &1 is stdout, not a file named 1 ;
2. The first of the topics in the first a.out (that is, a.out 1>outfile) output directed stdout to OutFile, and 2 (stderr) directed to &1 (stdout), and directed to OutFile, that is, the knot The output stdout and stderr of A.out are directed to OutFile .
3. The second a.out stderr directed to Stdout,stdout and directed to OutFile. (as a result, stderr was directed to the terminal, and StdIn was directed to outfile.) is not the same as the result of the first one!!! )
That's what you understand.
The following is an explanation of 2>&1 in the Advanced Programming of UNIX environment
a.out > OutFile 2>&1
Set the standard output to outfile first, and then execute the DUP to copy the standard output to descriptor 2 (standard error), with the result that standard output and standard errors are set to the same file, that is, descriptors 1 and 2 point to the same file table entry. And for the command line
A.out 2>&1 >outfile
Because the DUP is executed first, the descriptor 20% is the terminal (assuming the command is executed interactively), and the standard output is redirected to outfile. The result is a descriptor 1 that points to the file table entry for outfile, descriptor 2 to the terminal's File table entry .
The "2>&1" meaning script in the Linux shell is:
nohup/mnt/nand3/h2000g >/dev/null 2>&1 &
For & 1 More accurate should be the file descriptor 1, and 1 is generally representative of Stdout_fileno, in fact, this operation is a dup2 (2) call. He standard output to All_result, and then copy the standard output to the file descriptor 2 (stderr_ Fileno), the consequence is that file descriptors 1 and 2 point to the same file table entry , or the wrong output is merged. where 0 means keyboard input 1 means that the screen output 2 indicates an error output. REDIRECT standard error to standard output, and then throw it under/dev/null. In layman's words, all standard output and standard errors are thrown into the trash.
Command >out.file 2>&1 &
Command >out.file redirects the command output to the Out.file file, which means that the output is not printed to the screen, but is output to the Out.file file. 2>&1 is redirecting standard errors to standard output, where the standard output has been redirected to the Out.file file, and the standard error is output to the Out.file file. The last & is to have the command execute in the background.
Imagine what 2>1 stands for, the combination of 2 and > represents error redirection, while 1 represents the error redirection to a file 1, not the standard output ;
Replacing 2>&1,& with 1 represents the standard output, which becomes an error redirect to the standard output.
You can use
LS 2>1 test, will not report the error of No 2 file, but will output an empty file 1;
ls xxx 2>1 test, "No xxx This file" error output to 1;
ls xxx 2>&1 test, will not generate 1 of this file, but the error ran to the standard output;
ls xxx >out.txt 2>&1, actually can be replaced with ls xxx 1>out.txt 2>&1; redirect symbol > default is 1, Errors and outputs are uploaded to the out.txt.
Why 2>&1 to write in the back?
Command > File 2>&1
The first is command > file to redirect the standard output to file, 2>&1 is the standard error copy of the standard output behavior , which is also redirected to file, the end result is that the standard output and errors are redirected to file.
Command 2>&1 >file
The 2>&1 standard error copies the behavior of the standard output, but at this point the standard output is still in the terminal . The output is redirected to file after >file, but the standard error remains at the terminal .
With Strace you can see:
1. Command > File 2>&1
The key system call sequences that implement redirection in this command are:
Open (file) = = 3
Dup2 (3,1)
Dup2 (ON)
2. Command 2>&1 >file
The key system call sequences that implement redirection in this command are:
Dup2 (ON)
Open (file) = = 3
Dup2 (3,1)
Consider what kind of file-sharing structure the different dup2 () call sequences will produce !!!
A.out >outfile 2>&1 redirection problem in "Turn" Linux