cmd 2&1 log vs cmd log 2&1
Order matters. The way to reason about redirections is to read them from left to right and realize that redirections make streams point at the same place. They don't make streams point at each other.
What does that mean? If you say 2>&1
then you are redirecting stderr to wherever stdout is currently redirected to. If stdout is going to the console then stderr is, too. If stdout is going to a file then stderr is as well. If you follow this up by then redirecting stdout, stderr still points to what stdout used to point to. It does not "follow" stdout to the new location.
Right
cmd > log 2>&1
This redirects stdout to log
and then redirects stderr to wherever stdout is now being redirected, which is log
.
End result: both stdout and stderr are redirected to log
.
Wrong
cmd 2>&1 > log
This redirects stderr to wherever stdout is currently being redirected, which is typically the console. Then stdout is redirected to log
. Remember that stderr does not "follow" stdout, so it continues to redirect to the console.
End result: stdout is redirected to the log file and stderr is (still) sent to the console. This is almost certainly not what you want.
What does 2&1 in a Windows Command Do?
Decomposing the line
ping -n 40 127.0.0.1
Send 40 ping packets to local host. If there is not any problem the default behaviour is to wait 1 second between packets, so it generates a 39 second delay
>nul or 1>nul
Redirects anything written to the standard output stream (stream number 1) to the nul
device. Anything sent to this device is discarded. The effect is that all the normal output of the ping
command is hidden.
2>&1
This redirects anything written to the standard error stream (stream number 2). As in the previous case, this is done to hide output (errors in this case), but instead of directly requesting to write to the nul
device (we could have done 2>nul
), this syntax requests to send data in the standard error stream to a copy of the handle used in the standard output stream.
What is 2 in command, while redirecting both System.out , System.err Java messages to file
2 is a standard error file descriptor.
File descriptor 1 is the standard output (stdout).
File descriptor 2 is the standard error (stderr).
2>error.log
is used to redirect the standard error logs to a file named error.log
In Windows, what's the difference between 2&1 and 2&1?
Some examples should show what happens:
c:\YourDir> cd FolderNotHere > nul
The system cannot find the path specified.
You get the error stream
c:\YourDir>cd FolderNotHere > nul 2>&1
You get nothing, the error stream goes to the std output stream which goes to null.
c:\YourDir>cd > nul
You get nothing, the output stream goes to null.
c:\YourDir>cd > nul 1>&2
c:\YourDir
You get the std outout which has been sent to the error stream so it doesn't get redirected.
c:\YourDir>cd > nul 1<&2
This seams to do the same as 1>&2
How to redirect Windows cmd stdout and stderr to a single file?
You want:
dir > a.txt 2>&1
The syntax 2>&1
will redirect 2
(stderr) to 1
(stdout). You can also hide messages by redirecting to NUL
. More explanation and examples are on the Microsoft documentation page Redirecting error messages from Command Prompt: STDERR/STDOUT.
What does 2&1 mean?
File descriptor 1 is the standard output (stdout
).
File descriptor 2 is the standard error (stderr
).
At first, 2>1
may look like a good way to redirect stderr
to stdout
. However, it will actually be interpreted as "redirect stderr
to a file named 1
".
&
indicates that what follows and precedes is a file descriptor, and not a filename. Thus, we use 2>&1
. Consider >&
to be a redirect merger operator.
Windows command prompt log to a file
You can redirect the output of a cmd prompt to a file using >
or >>
to append to a file.
i.e.
echo Hello World >C:\output.txt
echo Hello again! >>C:\output.txt
or
mybatchfile.bat >C:\output.txt
Note that using >
will automatically overwrite the file if it already exists.
You also have the option of redirecting stdin, stdout and stderr.
See here for a complete list of options.
What does 2&1 mean?
File descriptor 1 is the standard output (stdout
).
File descriptor 2 is the standard error (stderr
).
At first, 2>1
may look like a good way to redirect stderr
to stdout
. However, it will actually be interpreted as "redirect stderr
to a file named 1
".
&
indicates that what follows and precedes is a file descriptor, and not a filename. Thus, we use 2>&1
. Consider >&
to be a redirect merger operator.
Related Topics
Pipe Output to Use as the Search Specification for Grep on Linux
How to Look Up a Variable by Name with #!/Bin/Sh (Posix Sh)
Colors with Unix Command "Watch"
What Should Linux/Unix 'Make Install' Consist Of
How to Launch a New Process That Is Not a Child of the Original Process
Finding Process Count in Linux via Command Line
Why Does Unix While Read Not Read Last Line
Device Number in Stat Command Output
Centos Error - Sudo: Effective Uid Is Not 0, Is Sudo Installed Setuid Root
Where Is Hardware Timer Interrupt
Error: Service "Xxx" Uses an Undefined Network "Xxx"
How to Recursively Copy a Directory into Another and Replace Only the Files That Have Not Changed
Difference Between Linux Loadable and Built-In Modules
How to Close a Netcat Connection After a Certain Character Is Returned in the Response
Android Studio 2.3 Using Emulator from Console, "/Dev/Kvm Device: Permission Denied" for Root User