[ClusterLabs] ocf scripts shell and local variables
Lars Ellenberg
lars.ellenberg at linbit.com
Wed Aug 31 11:58:35 UTC 2016
On Wed, Aug 31, 2016 at 12:29:59PM +0200, Dejan Muhamedagic wrote:
> > Also remember that sometimes we set a "local" variable in a function
> > and expect it to be visible in nested functions, but also set a new
> > value in a nested function and expect that value to be reflected
> > in the outer scope (up to the last "local").
>
> I hope that this wasn't (ab)used much, it doesn't sound like it
> would be easy to follow.
>
> > diff --git a/heartbeat/ocf-shellfuncs.in b/heartbeat/ocf-shellfuncs.in
> > index 6d9669d..4151630 100644
> > --- a/heartbeat/ocf-shellfuncs.in
> > +++ b/heartbeat/ocf-shellfuncs.in
> > @@ -920,3 +920,37 @@ ocf_is_true "$OCF_TRACE_RA" && ocf_start_trace
> > if ocf_is_true "$HA_use_logd"; then
> > : ${HA_LOGD:=yes}
> > fi
> > +
> > +# We use a lot of function local variables with the "local" keyword.
> > +# Which works fine with dash and bash,
> > +# but does not work with e.g. ksh.
> > +# Fail cleanly with a sane error message,
> > +# if the current shell does not feel compatible.
> > +
> > +__ocf_check_for_incompatible_shell_l2()
> > +{
> > + [ $__ocf_check_for_incompatible_shell_k = v1 ] || return 1
> > + local __ocf_check_for_incompatible_shell_k=v2
> > + [ $__ocf_check_for_incompatible_shell_k = v2 ] || return 1
> > + return 0
> > +}
> > +
> > +__ocf_check_for_incompatible_shell_l1()
> > +{
> > + [ $__ocf_check_for_incompatible_shell_k = v0 ] || return 1
>
> If there's no "local" and that in the function below fails, won't
> this produce a syntax error (due to __ocf_..._k being undefined)?
Which is ok with me, still return 1 ;-)
> > + local __ocf_check_for_incompatible_shell_k=v1
> > + __ocf_check_for_incompatible_shell_l2
This ^^ needs to be:
> > + __ocf_check_for_incompatible_shell_l2 || return 1
> > + [ $__ocf_check_for_incompatible_shell_k = v1 ] || return 1
> > + return 0
> > +}
> > +
> > +__ocf_check_for_incompatible_shell()
> > +{
> > + local __ocf_check_for_incompatible_shell_k=v0
Similarly, this:
> > + __ocf_check_for_incompatible_shell_l1
should be
> > + __ocf_check_for_incompatible_shell_l1 || return 1
> > + [ $__ocf_check_for_incompatible_shell_k = v0 ] && return 0
> > + ocf_exit_reason "Current shell seems to be incompatible. We suggest dash or bash (compatible)."
> > + exit $OCF_ERR_GENERIC
> > +}
> > +
> > +__ocf_check_for_incompatible_shell
>
> Looks good otherwise. If somebody's willing to test it on
> solaris...
There is a ksh93 for linux as well, and it appears to be very similar to
the one apparenly shipped with solaris. But yes, you are right ;-)
Lars
More information about the Users
mailing list