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/

Reply via email to