logoalt Hacker News

ablobtoday at 2:54 AM3 repliesview on HN

funny enough,

  2>&1 >/dev/null cat file
appears to yield the same output. So i wonder where the not "order-independent" chimes in.

Replies

pdpitoday at 3:15 AM

`2>&1` redirects FD2 to the current contents of FD1 (stdout), then `> /dev/null` redirects FD1 to /dev/null. That results in your errors going into stdout, and discarding regular output altogether:

    0: stdin  -> stdin  -> stdin
    1: stdout -> stdout -> /dev/null
    2: stderr -> stdout -> stdout
When you flip the order, `> /dev/null 2>&1` moves FD1 to /dev/null first, and then FD2 to the contents FD1 (/dev/null again), so you discard both errors and standard output:

    0: stdin  -> stdin     -> stdin
    1: stdout -> /dev/null -> /dev/null
    2: stderr -> stderr    -> /dev/null
In your example, `cat file` is unlikely to produce any errors, which is why you're not seeing a difference.
isityettimetoday at 3:05 AM

All of this depends on your specific shell and its parser. Fish doesn't let you put redirections at the beginning like that (though I wish it did), while GNU Bash does.

show 1 reply
ButlerianJihadtoday at 3:00 AM

You're absolutely wrong!

It does not yield the "same output", and here is why: if you cause your command to actually produce output on stderr (fd 2) it will appear as terminal output, because you have actually succeeded in "redirecting" stderr to wherever stdout (fd 1) was pointing initially.

show 1 reply