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