Reputation: 363
Please explain the output of this shell command:
ls >file1 >file2
Why does the output go to file2 instead of file1?
Upvotes: 1
Views: 2415
Reputation: 1007
Because first redirection gets overridden by the second. Note though, that an empty file1 is still created when file1 was opened for output.
Upvotes: 0
Reputation: 3185
The redirect operator is short for a stdout redirection(1>). Since the command is evaluated left to right, the last stdout redirection is used for the running of ls.
ls 1> file1 1>file2
is equivalent to
ls >file1 >file2
If you're trying to redirection stderr, use
ls > file1 2> file2
0 = stdin
1 = stdout
2 = stderr
try this, you'll notice that file2 will receive the stderr message.
ls ------ > file1 2> file2
then these, in both cases output will be in stdout and will go to file1.
ls >file1 2>file2
ls 1>file1 2>file2
Upvotes: 1
Reputation: 532518
bash
only allows one redirection per file descriptor. If multiple redirections are provided, like in your example, they are processed from left to right, with the last one being the only one that takes effect. (Notice, though, that each file will still be created, or truncated if already in existence; the others just won't be used by the process.)
Some shells (like zsh
) have an option to allow multiple redirections. In bash
, you can simulate this with a series of calls to tee
:
ls | tee file1 file2 > /dev/null
Each call to tee
writes its input to the named file(s) and its standard output.
Upvotes: 4
Reputation: 25397
If the shell finds multiple redirections of any output, it will redirect it to the last file given, in your case file2, since redirections are evaluated from left to right.
While it works, you should not do something like that!
Upvotes: 2
Reputation: 3669
You first redirected the STDOUT stream to go to file1 but then immediately redirected it to go to file2. So, the output goes to file2.
Every process initially has three file descriptors - 0 for STDIN, 1 for STDOUT and 2 for STDERR. >file1
means that open the file1 and assign its descriptor the id 1. Note that the process which is about to execute doesn't care about what is the end point where its STDOUT goes. It just writes to whatever is described by file descriptor 1.
For a more technical description of how this works, see this answer.
Upvotes: 0