[SGVLUG] Thanks for bash -c puzzle
Rae Yip
rae.yip at gmail.com
Mon Apr 19 17:51:26 PDT 2010
Matt, if you're doing this in perl (as suggested by your use of the
"system" call), then you can simply store your SQL query in a
variable, and then send it to open("| ssh host mysql ..."), rather
than getting all tangled up in shell syntax.
If you're doing it in pure shell, then heredocs are your best bet for
not having to re-quote anything. Seriously, I've done all this before,
so I know what the tricks are. The layered quoting way lies madness.
-Rae.
On Mon, Apr 19, 2010 at 4:44 PM, Matt Campbell <dvdmatt at gmail.com> wrote:
> Thanks Don,
>
>
>
> I came to the same realization earlier today. Rae actually came up with a
> single-level solution:
>
>
>
> echo ‘command’ | bash
>
>
>
> instead of
>
>
>
> bash -c ‘command’
>
>
>
> but echo runs into the same quoting quotes problem.
>
>
>
> The full solution ended up being:
>
>
>
> echo -e "echo 'ALTER TABLE \\\0140Components\\\0140 ORDER BY
> \\\0140type\\\0140,\\\0140Home\\\0140,\\\0140Class\\\0140,\\\0140Make\\\0140,
> \\\0140Model\\\0140,\\\0140Name\\\0140;ALTER TABLE \\\0140Documents\\\0140
> ORDER BY
> \\\0140type\\\0140,\\\0140Year\\\0140,\\\0140Make\\\0140,\\\0140Version\\\0140,\\\0140Line\\\0140;ALTER
> TABLE \\\0140Layouts\\\0140 ORDER BY \\\0140Date\\\0140;' | mysql -u 'matts'
> 'mattsInfo' -p'password' -h 'dbhost' " | /bin/bash 2>&1
>
>
>
> -e allows bash-echo to interpret backslashed octal characters which lets you
> embed quotes in your strings.
>
>
>
> It is being generated programmatically so the command is hidden from the
> casual user.
>
>
>
> Ok it’s ugly, at least it works…. ;)
>
>
>
> Matt
>
>
>
> From: Gibbs, Donald E (316B) [mailto:donald.e.gibbs at jpl.nasa.gov]
> Sent: Monday, April 19, 2010 3:12 PM
> To: Matt Campbell
> Subject: Re: Thanks for bash -c puzzle
>
>
>
> Hi, Matt
>
> You know, I followed Rae’s comment into the man pages for bash, down in the
> “QUOTING” section, and it seems pretty clear that you cannot put single
> quotes within other single quotes. Period. Backslashes won’t help. Looks
> like the shell simply does not support what would otherwise seem like a
> reasonable construction.
>
> You can put double quotes within other double quotes using backslashes. But
> not so with single quotes.
>
> I’ll nose around some more, but it looks pretty cut and dried to me.
>
> --Don
>
>
> On 4/19/10 10:44 AM, "Matt Campbell" <dvdmatt at gmail.com> wrote:
>
> Thanks Don, let me know if you come up with anything.
>
> The base problem is ‘How do you quote a quote in shell’?
>
> The smallest test case is:
>
> echo '\'hi\' '
>
> I think it should produce: 'hi'
>
> It does produce: Unmatched '.
>
> They sure look matched to me. This fails the same way in tcsh and bash on
> my Linux box.
>
> Matt
>
>
> From: Gibbs, Donald E (316B) [mailto:donald.e.gibbs at jpl.nasa.gov]
> Sent: Monday, April 19, 2010 10:37 AM
> To: Matt Campbell
> Subject: Re: Thanks for bash -c puzzle
>
> Rae Yip’s quote from the bash man page did not sound promising. I can’t
> spend too much time on this, I’ve got other pressing deadlines looming, but
> I’ll poke around at it.
>
> --Don
>
> On 4/19/10 10:29 AM, "Matt Campbell" <dvdmatt at gmail.com> wrote:
> The problem can be simplified down to:
>
> This works:
> ssh -lmatt scar '/bin/bash -c "echo works" '
>
> No variation of this appears to:
> ssh -lmatt scar '/bin/bash –c \'echo fails\' '
>
> The only difference is mixed quotes vs. quoted quotes. Do you see a
> solution?
>
> I want to force bash on the far end so that shell redirection can be used to
> capture error output back to the local host.
>
> All the rest of the (much more complex) command works.
>
> Matt
>
>
> From: Gibbs, Donald E (316B) [mailto:donald.e.gibbs at jpl.nasa.gov]
> Sent: Monday, April 19, 2010 10:15 AM
> To: Matt Campbell
> Subject: Thanks for bash -c puzzle
>
> Hi, Matt
>
> I used to be more active in SGVLUG years ago but have become a mere lurker
> lately.
>
> Thanks for asking about that bash question. I just started re-strengthening
> my shell scripting skills and your problem was timely.
>
> Not that I could answer your question, but it made some of the bash man page
> become more 3D, if you know what I mean.
>
> --Don
More information about the SGVLUG
mailing list