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
>