Re: [PATCH 3/6] doc: xargs does not use the (128+sig) convention of /bin/sh.
James Youngman <[email protected]> Wed, 8 Jul 2026 09:10:40 +0100
| Newsgroups | gmane.comp.gnu.findutils.bugs,gmane.comp.gnu.findutils.patches |
|---|---|
| Message-ID | <CAGwX766bsfZZAeZGqGQjvk8MTJPN3rSjHhShdY0h=T-UW2oFfA@mail.gmail.com> |
Another patch in the sequence addresses the problem you mentioned. On Tue, Jul 7, 2026 at 8:15=E2=80=AFAM 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 r= ow > 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 ex= it with 123. > # Finally demonstrate that 256 overflows to 0 (in the shell process, n= ot in xargs). > for f in $(seq 0 256); do \ > echo $f | xargs -I'{}' sh -c 'exit "{}"' sh; \ > ret=3D$?; \ > test $ret !=3D 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 >