On Wed, Aug 23, 2023 at 12:05:42PM +1000, Martin D Kealey wrote:
> On Wed, 23 Aug 2023, 05:29 Greg Wooledge, <g...@wooledge.org> wrote:
> 
> > Excuse me now, while I go and close several open FDs in the shell where
> > I tested something the other day, which I had no idea were left open.
> >
> 
> It's even worse than that; try:
> 
> echo Hi {X}>/dev/null
> ls -l "/proc/$$/fd/$X"

That's a really strange example.  I wonder what would lead someone to
write that particular redirection.  What's the intended outcome, in
terms of the variable X and the state of file descriptors?  If you
simply want to discard output, there's no reason I can think of to
use {X}>/dev/null instead of simply >/dev/null.

The thing I was testing was in response to this question, which was
posed as an exercise:

    Swap stderr and stdout of a shell command.

I gave two answers:

    cmd 3>&1 1>&2 2>&3 3>&-

and

    cmd {fd}>&1 1>&2 2>&$fd {fd}>&-

As it turns out, the second one does *not* close the temporary file
descriptor, so each time I ran the function while testing, an extra
file descriptor was left open.

But this variant *does* close it:

    cmd {fd}>&1 1>&2 2>&$fd
    exec {fd}>&-

I find this incredibly confusing.

Reply via email to