[GRASS-dev] g.mremove bug?
Ivan Shmakov
ivan at theory.asu.ru
Sun Feb 24 10:47:25 EST 2008
>>>>> Glynn Clements <glynn at gclements.plus.com> 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
More information about the grass-dev
mailing list