Red Hat Bugzilla – Bug 503134
guestfish's list splitting does not recognize internal quoting
Last modified: 2010-05-12 08:00:10 EDT
Richard W.M. Jones wrote:
> On Thu, May 28, 2009 at 05:41:44PM -0500, Charles Duffy wrote:
>> What's the Right Way to do the below?
>>> <fs> command "bash -c 'for D in avahi-daemon avahi-dnsconfd haldaemon;
>> do /sbin/chkconfig $D off; done; true'"
>> libguestfs: error: D: -c: line 0: unexpected EOF while looking for
>> matching `''
>> D: -c: line 1: syntax error: unexpected end of file
> The problem is that guestfish's list splitting code sucks, so
> the above turns into the equivalent of this API call:
> guestfs_command (g, "bash", "-c", "'for", "D", "in",
> "avahi-daemon", "avahi-dnsconfd", "haldaemon;",
> "do", "/sbin/chkconfig", "$D", "off;", "done;", "true'");
> Please file a bug about this.
Behavior should be closer to that of the actual shell, or python's "shlex", preserving quoted strings as individual tokens. (Alternately, system() could be used in place of an exec call, such that the tokenizing is done by an _actual_ shell within the guest).
The syntax I was thinking of using was:
guestfish doesn't include a real scanner, instead it
splits on whitespace. However it checks the first character
of each argument and modifies its behaviour accordingly.
For example, if the first character is ' or " then instead
of blindly splitting, it searchs for the corresponding close-quote.
So with the syntax above, if the first character after whitespace
was an opening [ then we would parse the rest as comma-separated
strings until a matching ] was found.
(The alternative would be to use lex and write a real scanner,
but we'd need to be careful not to break existing scripts).
This cset adds support for 'sh' and 'sh-lines' commands
which should alleviate this problem.
><fs> sh "echo /s*"
/sbin /selinux /srv /sys
><fs> sh-lines "ls -1d /s*"
Believed to be fixed by: