Hi Branden,
> Namely,
>
> .tr @--@
>
> is not a no-op!
Is that surprising, even if troff isn't known?
$ tr ab ba <<<abba
baab
$
> In fact, it works a lot like file descriptor redirections in the
> shell.
>
> foo >/dev/null 2>&1 | grep error
That pipeline's not doing what ‘grep error’ suggests. And tr and
redirection don't, to my mind, work in a similar manner.
Transliteration is conceptually done by a simple look-up table which is
only indexed once per character. ‘tr a b’ or ‘.tr ab’ stores ‘b’ at
index ‘a’. If ‘@--@’ were a no-op then how would swapping ‘@’ and ‘-’
be achieved?
Redirection is done left to right. So the above pipeline maps stdout to
null and then stderr to stdout which is by now null. It's ‘.tr 1n2n’ in
file-descriptor terms. The grep for ‘error’ suggests ‘.tr 1n21’ is
wanted.
$ ls error >/dev/null 2>&1 | grep error | nl
$
$ ls error 2>&1 >/dev/null | grep error | nl
1 /bin/ls: cannot access 'error': No such file or directory
$
If redirection were like transliteration then order wouldn't matter.
Just as ‘.tr 1n21’ and ‘.tr 211n’ are the same, these would be too.
ls error >/dev/null 2>&1
ls error 2>&1 >/dev/null
Which would result in a loss of expression.
--
Cheers, Ralph.