They are actually not “order-independent”, and their L-R parsing/processing is why constructs such as
cat file > /dev/null 2>&1
work as intended. cat file > /dev/null 2>&1
work as intended. 2>&1 >/dev/null cat file
appears to yield the same output. So i wonder where the not "order-independent" chimes in.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.
And that is because fish isn't POSIX-compliant. It's like when translating languages, some words are cognate, but some are "false friends" and while they look the same, they don't mean the same thing. So when using redirections in fish, the rules may be similar up to a point, but only up to a point.
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.