Fixing bash script bogosity - help?
pgf at laptop.org
pgf at laptop.org
Mon Apr 27 17:34:08 EDT 2009
hi martin --
> I have a simple shell scripting problem :-) you'll find attached a
> shell script that ships with ejabberd. It is a fairly straightforward
> bit of code, and allows us to control bits of the ejabberd internals
> with a nice cli interface. (Feel free to skip the start / stop bits of
> the code, I'm fighting with the ctrl function.)
> The problem it has is that the parameters are passed to a bash or
> runas invocation -- at which point the quoting is a mess. Currently I
> am working around it in the caller by doing some stupid
> nested-quoting. But this should be easy to cure -- if anyone knows a
> bit more bash (or portable shell!) than me :-)
> A minimal exposition of the problem is as follows:
> $ cat sample.sh
> #!/bin/bash -x
> # in the script, the CMD is built up as a string
> CMD="touch $@"
> # in practice we somtimes use /sbin/runuser -c
> # and other times plain bash -c
> bash -c "$CMD"
first, you want to preserve the original quoting of the args by
using "$@". it must look just like that. second, you don't need
the "bash -c" there. just run $CMD directly. so, the invocation
you want is:
in your original script looks like this
$NAME ejabberdctl \
-pa $EJABBERD_EBIN \
-s ejabberd_ctl -extra $ERLANG_NODE $@ \
if [ "$W" != "ejabberd" ]; then
/sbin/runuser -s /bin/bash - ejabberd -c "$ERL_COMMAND"
bash -c "$ERL_COMMAND"
a) remove $@ from the ERL_COMMAND definition
b) change the "bash -c" line to be:
c) to fix the runuser invocation (assuming it's broken, and i guess
it probably is), i think will be trickier. i'm sure we can fix
how's this so far?
paul fox, pgf at laptop.org
More information about the Devel