[ 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

Reply via email to