[GRASS-dev] gis.m in wingrass: using where clause in d.vect
causes error :can't read "_data(.gronsole.gronsole, 9,
donecmd)": no such element in array
Moritz Lennert
mlennert at club.worldonline.be
Mon Oct 23 14:59:08 EDT 2006
On Tue, October 10, 2006 05:22, Glynn Clements wrote:
>
> Moritz Lennert wrote:
>
>> >> Huidae or Glynn, any ideas on this ?
>> >
>> > # Actually run the program
>> > if { $mingw == "1" } {
>> > # shell scripts require sh.exe.
>> > set cmd [concat | sh -c '$cmd']
>> > } else {
>> > set cmd [concat | $cmd 2>@ stdout]
>> > }
>> >
>> > If you want to use "sh -c ...", you have to escape any shell
>> > metacharacters, otherwise commands which happen to contain shell
>> > metacharacters (e.g. "<" or ">" in a SQL "WHERE" clause) won't work.
>> >
>> > I've already explained this in the thread discussing these changes.
>>
>> Found
>> http://grass.itc.it/pipermail/grass5/2006-September/025834.html
>>
>> where you say
>>
>> "The simplest solution to the issue of
>> metacharacters is to replace any occurrences of the single quote
>> character in arguments with "'\''" (quote, backslash, quote, quote)
>> and surround each argument with single quotes.
>>
>> Even then, there might be issues due to the shell messing with the
>> environment, signal handling, process groups etc (as well as possible
>> Unix-compatibility "features"). Shells are very complex programs."
>>
>> Not sure that I understand exactly what needs to be done and where.
>
> In the above Tcl code, $cmd is a Tcl list (a string using a specific
> syntax which ensures that element boundaries are preserved even when
> elements contain spaces etc).
>
> Using that string as an argument to "sh -c ..." will only work
> correctly if the format of the string is such that the shell will
> parse it into the same list of strings that Tcl would. In practice,
> this will only happen if none of the elements contain any characters
> which are significant to either Tcl or the shell (which includes
> spaces, as they are normally treated as element separators).
>
> IOW, "sh -c '$cmd'" will only work for commands where none of the
> arguments contain either Tcl or shell metacharacters. If you want to
> invoke $cmd via "sh -c ...", you have to take the list apart and
> construct a command line using shell syntax.
>
> E.g. (untested):
>
> set shcmd ""
> foreach arg $cmd {
> set arg2 [regsub -all {'} $arg {'\''}]
> if {$shcmd == ""} {
> set shcmd "'$arg2'"
> } else {
> set shcmd "$shcmd '$arg2'"
> }
> }
> set cmd [concat | sh -c $shcmd]
Finally gotten around to trying this. After adding simple quotes to the
last line:
set cmd [concat | sh -c '$shcmd']
I don't get the error anymore, but it still doesn't work as it should:
comcod=21004 works
but comcod=21004 and comcod=21005
only show comcod=21004, not 21005
and comcod>21004 doesn't show anything, but doesn't produce an error message.
>
> However, for various reasons, it would be better if we could find a
> way avoid using "sh -c ..." altogether. The problem there is that you
> can't directly execute shell scripts on Windows.
agreed, but have we found a way for doing this, yet, at least theoretically ?
Moritz
More information about the grass-dev
mailing list