>>>>> Glynn Clements <[EMAIL PROTECTED]> writes:

 >>> The more fundamental problem with using xargs is that the GRASS
 >>> parser requires multiple "answers" for any given option to be
 >>> separated by commas, not spaces.

 >> Does it?  IIUC, the following commands are completely equivalent as
 >> long as the GRASS parser is concerned:

 >> $ g.remove rast=foo,bar

 >> $ g.remove rast=foo rast=bar

 > Right; I was thinking specifically about the former case. It's so
 > long since I've seen the latter form used that I had forgotten about
 > it.

        That's strange -- I use the latter form quite often, mostly as:

$ g.mlist ... | sed -e s/^/OPTION=/ | xargs GRASS-COMMAND ...

        or, e. g.:

$ r.patch output=foo $(g.mlist ... | sed -e s/^/input=/)

[...]

 >>> That effectively requires g.mremove to collate names itself.

 >>> Invoking g.remove once per map is simpler, but it's also
 >>> inefficient.

 >> Huh?  Even simpler than the following?

 > Yes.

 > Generating shell commands using sed then executing them is anything
 > but simple;

        But the idea is overly simple: since `g.remove' requires every
        map name to be prefixed by its type (e. g., `rast='), we're
        going exactly this way -- changing every line to begin with
        `TYPE='.

 > particularly when the sed command is itself generated using shell
 > features (variable substitution).

 > "while read map ; do g.remove ... ; done" may be more verbose, but
 > it's much easier to understand.

        That'll be:

foo () {
    while read map ; do g.remove "$1=$map" ; done
}

        if there's a desire to have just one function for every map
        type.  I don't think it's much more complex than:

foo () {
    while read map ; do echo "$1=$map" ; done | xargs g.remove
}

        or, with a more appropriate tool to do the substitution:

foo () {
    sed s/^/"$1"/ | xargs g.remove
}

        For my students, I've explained it roughly as follows:

        * there're some commands that read a file with a list of objects
          (files) to perform the operation on (e. g., $ wget -i);
          standard input is a particular case of a file ($ wget -i -);

        * there're much more commands that obtain the list from the
          command line (e. g., $ ls, $ chmod, etc.);

        * there're commands which can do both ($ wget URL, or $ echo URL
          | wget -i -);

        * for these commands that cannot read the list from a file,
          there's the `xargs' command, which ``transforms'' the contents
          of the given file into the command line arguments for a
          command; then, there're OS limits on the command line length.

        Anyway, could you please comment on my patch [1]?  I've tested
        it a bit, but the `g.mremove' command wouldn't probably be the
        one I'll use myself much.

[1] nntp://news.gmane.org/gmane.comp.gis.grass.devel/25056

_______________________________________________
grass-dev mailing list
[email protected]
http://lists.osgeo.org/mailman/listinfo/grass-dev

Reply via email to