[ attempting to consolidate two identical threads into one ]
Brian Somers <[EMAIL PROTECTED]> writes:
> I agree - the script idea doesn't seem right.
>
> If {} isn't allowed to implicitly mean ``all the arguments that'll
> fit'', then I'd vote for using -i (a version that does full grouping)
> although I would not vote for the semantics whereby -i must either be
> followed directly with the replacement string (with no intervening
> spaces) or else have an implicit {} replacement string, ie we should
> have these meaning the same thing:
>
> xargs -i '<<<>>>' command blah '<<<>>>' blah
> xargs -i'<<<>>>' command blah '<<<>>>' blah
I honestly don't understand the differnece between this and the -y
option gad described. Nevertheless, it seems that pretty much
everyone agrees that something like this is a good idea.
Attached is a patch that adds a -Y option to xargs which does, well,
pretty much what I imagine the above would do. Here are a couple of
examples:
dima@spike% cat test # test input
this is just
a test; it has
no real purpose
in life
dima@spike% ./xargs -Y {} echo CMD LINE ARGS < test
CMD LINE ARGS this is just a test; it has no real purpose in life
dima@spike% ./xargs -Y {} echo {} CMD LINE ARGS < test
this is just a test; it has no real purpose in life CMD LINE ARGS
dima@spike% ./xargs -Y {} echo CMD {} LINE ARGS < test
CMD this is just a test; it has no real purpose in life LINE ARGS
dima@spike% ./xargs -Y {} echo CMD LINE {} ARGS < test
CMD LINE this is just a test; it has no real purpose in life ARGS
dima@spike% ./xargs -Y {} echo CMD LINE ARGS {} < test
CMD LINE ARGS this is just a test; it has no real purpose in life
dima@spike% ./xargs -n 2 -Y {} echo CMD LINE {} ARGS < test
CMD LINE this is ARGS
CMD LINE just a ARGS
CMD LINE test; it ARGS
CMD LINE has no ARGS
CMD LINE real purpose ARGS
CMD LINE in life ARGS
I'm not sure the patch is entirely correct. xargs seems to be overly
complicated in the way it does some of its processing, but it works
and I believe I managed to maintain most of the assumptions it makes.
Comments? Suggestions?
Thanks,
Dima Dorfman
[EMAIL PROTECTED]
Index: xargs.c
===================================================================
RCS file: /st/src/FreeBSD/src/usr.bin/xargs/xargs.c,v
retrieving revision 1.9
diff -u -r1.9 xargs.c
--- xargs.c 1999/08/28 01:07:50 1.9
+++ xargs.c 2001/04/20 22:37:15
@@ -73,6 +73,8 @@
int cnt, indouble, insingle, nargs, nflag, nline, xflag, wasquoted;
char **av, *argp, **ep = env;
long arg_max;
+ int apargs = 0;
+ char **avv, *replstr = NULL;
/*
* POSIX.2 limits the exec line length to ARG_MAX - 2K. Running that
@@ -96,7 +98,7 @@
nline -= strlen(*ep++) + 1 + sizeof(*ep);
}
nflag = xflag = wasquoted = 0;
- while ((ch = getopt(argc, argv, "0n:s:tx")) != -1)
+ while ((ch = getopt(argc, argv, "0n:s:txY:")) != -1)
switch(ch) {
case 'n':
nflag = 1;
@@ -115,6 +117,9 @@
case '0':
zflag = 1;
break;
+ case 'Y':
+ replstr = optarg;
+ break;
case '?':
default:
usage();
@@ -144,6 +149,13 @@
else {
cnt = 0;
do {
+ if (replstr && strcmp(*argv, replstr) == 0) {
+ apargs = 1;
+ *argv++;
+ for (avv = argv; *avv; *avv++)
+ cnt += strlen(*avv) + 1;
+ break;
+ }
cnt += strlen(*bxp++ = *argv) + 1;
} while (*++argv);
}
@@ -211,6 +223,8 @@
if (xp == exp || p > ebp || ch == EOF) {
if (xflag && xp != exp && p > ebp)
errx(1, "insufficient space for arguments");
+ for (avv = argv; apargs && *avv; *avv++)
+ strlen(*xp++ = *avv) + 1;
*xp = NULL;
run(av);
if (ch == EOF)
@@ -253,6 +267,8 @@
if (xflag)
errx(1, "insufficient space for arguments");
+ for (avv = argv; apargs && *avv; *avv++)
+ strlen(*xp++ = *avv) + 1;
*xp = NULL;
run(av);
xp = bxp;
To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-current" in the body of the message