On Tue, 2 Feb 2010, Ingo Schwarze wrote:
Hi Antti,
Antti Harri wrote on Tue, Feb 02, 2010 at 07:31:57PM +0200:
xargs' -L switch isn't working when using -0 flag.
After checking POSIX.1 (2008), i conclude that our implementation and
manual are correct in this respect. The -L option is concerned
with "lines of arguments from standard input". ASCII nul characters
do not delimit lines.
Also, be careful not to confuse -L with -n.
Hello.
Ahh, you're correct, thanks for a very thorough explanation.
The talk about the size of the buffers in -n confused me and I did not use
it.
Here's a demonstration:
$ cd /tmp/
$ mkdir foo bar
$ find /tmp/foo /tmp/bar | xargs -L 1 echo
/tmp/foo
/tmp/bar
$ find /tmp/foo /tmp/bar -print0 | xargs -0 -L 1 echo
/tmp/foo /tmp/bar
Fine, that's correct behaviour. Telling find(1) to -print0,
you put the output on one single line, like this:
$ printf "/tmp/foo\0/tmp/bar\0" | xargs -0 -L1
/tmp/foo /tmp/bar
Your patch breaks X/Open System Interfaces (XSI) compatibility.
Arguably, that's not terribly important because -0 is a non-standard
extension anyway. But still, even if we didn't care about the
standard, i don't see the point of changing this patch.
As it is now, -L with and without -0 harmonize very well:
schwa...@gini $ printf "a b\nc" | xargs -L1
a b
c
schwa...@gini $ printf "a\0b\nc" | xargs -0 -L1
a b
c
So, xargs -0 treats '\0' just like plain xargs treats the blank:
delimiting an argument, but not a line.
In addition to that, your patch is wrong because it treats '\0'
as an end-of-line indicator even when -0 is not in effect.
Tested also on OS X and Linux and they print two lines with -0.
So you might wish to file bug reports with these operating systems.
Yours,
Ingo
Index: xargs.c
===================================================================
RCS file: /cvs/src/usr.bin/xargs/xargs.c,v
retrieving revision 1.26
diff -u -r1.26 xargs.c
--- xargs.c 27 Oct 2009 23:59:50 -0000 1.26
+++ xargs.c 2 Feb 2010 16:45:26 -0000
@@ -259,6 +259,7 @@
goto addch;
goto arg2;
case '\0':
+ count++;
if (zflag)
goto arg2;
goto addch;