Another patch in the sequence addresses the problem you mentioned.

On Tue, Jul 7, 2026 at 8:15 AM Bernhard Voelker
<[email protected]> wrote:
>
> Hi James,
>
> On 7/6/26 22:06, James Youngman wrote:
> > * doc/find.texi: Point out that xargs does not launch commands via the
> > shell and does not use the "128 + signal" convention used for $? in
> > the shell.
> > * xargs/xargs.1: Likewise.
> > ---
> >   doc/find.texi | 5 +++--
> >   xargs/xargs.1 | 8 ++++++--
> >   2 files changed, 9 insertions(+), 4 deletions(-)
> >
> > diff --git a/doc/find.texi b/doc/find.texi
> > index f693db8c..71b80f53 100644
> > --- a/doc/find.texi
> > +++ b/doc/find.texi
> > @@ -3996,9 +3996,10 @@ if the command is not found
> >   if some other error occurred.
> >   @end table
> >
> > -Exit codes greater than 128 are used by the shell to indicate that
> > -a program died due to a fatal signal.
> >
> > +The commands run by @code{xargs} are not invoked via the shell.  The
> > +shell's @math{128 + n} convention for reporting that a process had
> > +been killed by a signal is not used by @code{xargs}.
>
> While this is correct and, well, describes what xargs does _not_ do,
> I think the confusion of the recent bug report stems from the following row
> of the table with the exit codes:
>
>    125    if any invocation of the command exited with status 1-125
> _______________________________________________________________^^^
>
> This is not the complete range:
>
>    for f in $(seq 120 130); do echo $f | xargs -I'{}' sh -c 'set -x; exit 
> "{}"' sh; echo $?; done
>    + exit 120
>    123
>    + exit 121
>    123
>    + exit 122
>    123
>    + exit 123
>    123
>    + exit 124
>    123
>    + exit 125
>    123
>    + exit 126
>    123
>    + exit 127
>    123
>    + exit 128
>    123
>    + exit 129
>    123
>    + exit 130
>    123
>
> The practical range for exit is 0-255.
> And xargs(1) itself exits with 123 for all command exit values in 1..254.
> Only 0 and 255 are treated different.
>
>    # For all command exit codes, find the ones which make xargs(1) not exit 
> with 123.
>    # Finally demonstrate that 256 overflows to 0 (in the shell process, not 
> in xargs).
>    for f in $(seq 0 256); do \
>      echo $f | xargs -I'{}' sh -c 'exit "{}"' sh; \
>      ret=$?; \
>      test $ret != 123 \
>        && echo "$f -> $ret"; \
>    done
>    0 -> 0
>    xargs: sh: exited with status 255; aborting
>    255 -> 124
>    256 -> 0
>
> Therefore, the documentation fix would be:
>
> -  125    if any invocation of the command exited with status 1-125
> +  125    if any invocation of the command exited with status 1-254
>
> WDYT?
>
> Have a nice day,
> Berny
>

Reply via email to