[ClusterLabs] ocf scripts shell and local variables

Lars Ellenberg lars.ellenberg at linbit.com
Wed Aug 31 07:58:35 EDT 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