Re: findutils xargs.c change request
Bernhard Voelker <[email protected]> Mon, 23 Feb 2026 22:30:10 +0100
| Newsgroups | gmane.comp.gnu.findutils.bugs |
|---|---|
| Message-ID | <[email protected]> |
Hi David,
please send reports like this to the GNU findutils mailing list instead of using personal email.
On 2/17/26 18:12, David Marceau wrote:
> https://cgit.git.savannah.gnu.org/cgit/findutils.git/tree/xargs/xargs.c#n1369 <https://cgit.git.savannah.gnu.org/cgit/
> findutils.git/tree/xargs/xargs.c#n1369>
>
> I wish to have it be replaced with this:
Thanks for the report and the suggested code change.
> if (E2BIG != errno)
> {
> error (0, 0, "%s: %s", strerror (errno), argv[0]);
> }
Using strerror() is not necessary as error() already caters for it.
> Ultimately it's because when I read the errors coming from xargs.
> For example a build task.
>
> GEN kernel/kheaders_data.tar.xz
> xargs: perl: No such file or directory
It would have been nice to see the executed command line. Assuming you are using
decent Makefile style one would probably see that with 'make $TARGET VERBOSE=yes V=1'.
Still, that's easy to craft a trivial reproducer:
$ echo hello | xargs no-such
xargs: no-such: No such file or directory
This means that the program 'xargs' had a problem with 'no-such', an the error was ENOENT.
> When I look at these 2 lines, I make a lot of assumptions to truly decipher it correctly.
>
> interpretation 1) ok so perl was called and it didn't find a file...was it kernel/kheaders_data.tar.xz that is couldn't
> find?
> interpretation 2) ok so there is a word perl and right after it, it says no such file or directory. Am I to understand
> it means that no such file or directory called perl?
> interpretation 3) Ok tar.xz is there, ok xargs launched, ok perl launched ok...there's an empty parameter perl was
> expecting. What was the variable name holding the empty parameter? What was the kind of value it was supposed hold? Give
> me a hint?tar? script? wtf!
Other errors from the called program look like ... well, whatever the program or command outputs.
E.g.
$ echo hello | xargs du --no-such-option
du: unrecognized option '--no-such-option'
Try 'du --help' for more information.
> In my mind, the error should appear first and then display the location of the error line/column along with the full
> file path in question.
> The above output fails to explicitly describe the error in a manner that is easy to read.
> SUGGESTION: I am asking that within the build scripts error strings contain complete sentences describing the situation
> also clearly specifying fieldnames and their respective values that to this error. This will help mitigate
> misinterpretations. Don't make the reader try to read your mind, express error message clearly and give as much
> information as you can as to what led to this.
>
> Thank you. I know the odds of this change being admitted are slim but at least it helps to understand why it might be
> saving a lot of interpretation time from others if we made complete sentences in error strings.
I agree that the error diagnostic is a bit brief, yet I'd like to change it to what the
GNU coreutils do in the utilities like chroot(1), nohup(1), split(1) and timeout(1).
$ echo hello | xargs/xargs no-such
xargs/xargs: failed to run command 'no-such': No such file or directory
Pushed the attached.
Have a nice day,
Berny
0001-xargs-improve-error-diagnostic-when-execvp-fails.patch
(text/x-patch, 1.7 KB)
From c356ebc5bbab38b20109026b335c5118c1fe69d4 Mon Sep 17 00:00:00 2001 From: Bernhard Voelker <[email protected]> Date: Mon, 23 Feb 2026 22:09:14 +0100 Subject: [PATCH] xargs: improve error diagnostic when execvp fails * xargs/xargs.c (xargs_do_exec): Use translation string to diagnose that running the command via execpv failed, and quote the given command appropriately. * NEWS (Improvements): Mention the change. Reported by David Marceau. --- NEWS | 5 +++++ xargs/xargs.c | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index d4002688..aa99ccf3 100644 --- a/NEWS +++ b/NEWS @@ -39,6 +39,11 @@ GNU findutils NEWS - User visible changes. -*- outline -*- (allout) are passed with a leading dash, e.g. '-!'. Future releases will not accept that any more. Accepting that was rather a bug "since the beginning". +** Improvements + + xargs now gives a better error diagnostic when executing the given command + failed. + ** Documentation Changes The forthcoming Issue 8 of the POSIX standard will standardise "find diff --git a/xargs/xargs.c b/xargs/xargs.c index 7ff17f51..262a64cf 100644 --- a/xargs/xargs.c +++ b/xargs/xargs.c @@ -1368,7 +1368,8 @@ xargs_do_exec (struct buildcmd_control *ctl, void *usercontext, int argc, char * close (fd[1]); if (E2BIG != errno) { - error (0, errno, "%s", argv[0]); + error (0, errno, _("failed to run command %s"), + quotearg_n_style (0, locale_quoting_style, argv[0])); } /* The actual value returned here should be irrelevant, * because the parent will test our value of errno. -- 2.52.0