tech-userlevel archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: why complain about a broken pipe?



On Wed, 8 Feb 2012 01:44:51 -0500 (EST)
Mouse <mouse%Rodents-Montreal.ORG@localhost> wrote:

> > I posted my original query because I object to pax (and xargs)
> > complaining about EPIPE.  I don't see the need.  The script can't
> > capture it,
> 
> Actually, scripts _can_ capture it.  stderr can be redirected.

Oh, yes, I know.  To split the hair ever so finely, "it" in that
sentence is meant to refer to EPIPE.  It doesn't show up in the 
shell's $? variable or similar, and can't be acted on
programmatically.  

> xargs is, if you will, acting as a
> (severely special-case) shell in that it's running other
> user-specified processes; as such, it's well within its bailiwick to
> report on abnormal terminations.  

Oh, no.  xargs is no shell at all!  It's a mere re-arranger made
necessary by mistaken choices, an ugly elbow-joint in the pipe.  

        $ find /usr | xargs ls -F 

could as well be expressed as 

        $ ls -F $(find /usr)

or even 

        $ find /usr | ls -F 

but for accidents of history.  As such, xargs has no more right to talk
to the user than the "|" character, and as much duty to report the exit
status.  

> Well, if you don't have SIGPIPE ignored, caught, or blocked, you
> don't last long enough to even _get_ EPIPE

Ah.  I would have stumbled on that eventually, but I appreciate the
education.  You're quite right, of course: pax.c ignores SIGPIPE around
line 430.  

It needs to because "pax -w" writes an archive to standard output by
default.  Connect it to ssh to copy files across a network.  Which, I
admit, is kinda important to get right.  

$ pax -w * | hexdump -C | head -1
00000000  1b 5b 3f 31 3b 32 63 1b  5b 3f 31 3b 32 63 1b 5b  |.[?1;2c.[?
1;2c.[| 
pax: Failed write to archive volume: 1 (Broken pipe)

ATTENTION! pax archive volume change required.
Ready for archive volume: 2
Input archive name or "." to quit pax.
Archive name > ^C
pax: Signal caught, cleaning up.

Typing "." yields a list of files not processed, something that would
be a lot harder to do without ignoring SIGPIPE.  ;-)   And, as we'll
hear a lot in the coming months here in the US, I approve of this
message.  About not being able to write the archive volume, that is.  

The table of contents is another matter....

Regards, 

--jkl


Home | Main Index | Thread Index | Old Index