On Mon, Nov 22, 2010 at 8:37 AM, rajeevrkv wrote:
Aah, the subtleties of shell plumbing....
The way that plumbing works is fabulous. (I had read about this to an extent, but there were more details as you've explained below)
$ cat < foo bash: foo: No such file or directory
Yes, I failed to notice the difference initially, though I knew that '<' will cause an input to be redirected from the file to STDIN of process. (cat)
$ cat < foo 2> error bash: foo: No such file or directory
Remember, bash has no idea when the process may be expecting the input, it just has to keep it available on the STDIN fd for whenever the process asks to read it. In order to do that, bash FIRST creates the fd pointing to the file, then creates the fd redirecting STDERR to another file and then finally starts the process with the redirection in place. Now, if the initial creation of the fd does not take place, "bash" thrown the error on it's STDERR fd, not the STDERR fd of "cat"(Actually, the cat process is not actually even started, since the redirection setup failed.) That's why the redirection of the "cat" process STDERR does not capture the errror message.
Thanks for the detailed explanation I did understand what you said. (Bash expands the meta-characters first and then processes the command).
So effectively, whenever, we are redirecting to STDOUT or STDERR, the command (process) that is executed, its output or error is put into a file. Anytime, the input for bash fails (via file through < operator), the subsequent STDOUT and STDERR are reverted to usual (the terminal) [even if appeared to be changed in the actual command].
I hope that this makes shell redirection a little clearer for you.
It does. It gives me more insight into the way Bash works. If there's a book / link, which provides such details with examples, I'll be able to understand bash better than I currently do.
Thankyou very much. You've been a patient guy in explaining all this. (I remember / know you when I met you at one of the colleges explaining students about Fedora Linux) :)
-- Roshan Baladhanvi