Thanks, Lars, for the explanation. Dejan, can you fix it?
On Thu, Sep 23, 2010 at 4:48 PM, Lars Ellenberg <lars.ellenb...@linbit.com> wrote: > On Wed, Sep 22, 2010 at 08:26:43AM -0600, Serge Dubrouski wrote: >> Thanks, Dejan - >> >> There was one more little patch for pgsql to replace: >> >> ocf_run $quietrun su $OCF_RESKEY_pgdba -c "$*" >> >> with >> >> ocf_run $quietrun su $OCF_RESKEY_pgdba -c "cd $OCF_RESKEY_pgdata; $@" > > Don't do that. > shell quoting is like gamling at times. > > o() { > output=`"$@" 2>&1`; > set +x; > echo "----- result:"; > echo "$output"; > }; > p0() { ( set -x; o su lars -c "cd . ; $@" ); } > p1() { ( set -x; o su lars -c "cd . ; $*" ); } > > # invokation: > > The "$@" Variant: > # p0 'printf "%s\n"' "a white space a" b c d > + o su lars -c 'cd . ; printf "%s\n"' 'a white space a' b c d > ++ su lars -c 'cd . ; printf "%s\n"' 'a white space a' b c d > + output= > + set +x > ----- result: > > > D'oh. Nothing. Why? > Because the extra arguments have become extra arguments to su as well, > and are no longer part of the script passed to -c. > > The "$*" Variant: > # p1 'printf "%s\n"' "a white space a" b c d > + o su lars -c 'cd . ; printf "%s\n" a white space a b c d' > ++ su lars -c 'cd . ; printf "%s\n" a white space a b c d' > + output='a > white > space > a > b > c > d' > + set +x > ----- result: > a > white > space > a > b > c > d > > Not too good, but at least acceptable. > > All in one parameter, special case, no difference with $* and $@ > # p1 'printf "%s\n" "a white space a" b c d' > + o su lars -c 'cd . ; printf "%s\n" "a white space a" b c d' > ++ su lars -c 'cd . ; printf "%s\n" "a white space a" b c d' > + output='a white space a > b > c > d' > + set +x > ----- result: > a white space a > b > c > d > > > It does not make a difference for the current use of runasowner, > as long as you use it always with exactly one parameter. > > But as that is non-obvious to most, and people are going to copy'n'paste > from that resource agent later, don't do the "$@". > > Expansion of $@ and $* within double quotes is very much different, > and $@ in this context is very likely wrong, as it may pass flags > to su which had been meant to be passed to the command run within -c. > > But yes, do the "cd $OCF_RESKEY_pgdata; $*". > No problem with that. > > -- > : Lars Ellenberg > : LINBIT | Your Way to High Availability > : DRBD/HA support and consulting http://www.linbit.com > > DRBD® and LINBIT® are registered trademarks of LINBIT, Austria. > _______________________________________________________ > Linux-HA-Dev: Linux-HA-Dev@lists.linux-ha.org > http://lists.linux-ha.org/mailman/listinfo/linux-ha-dev > Home Page: http://linux-ha.org/ > -- Serge Dubrouski. _______________________________________________________ Linux-HA-Dev: Linux-HA-Dev@lists.linux-ha.org http://lists.linux-ha.org/mailman/listinfo/linux-ha-dev Home Page: http://linux-ha.org/