On Monday, July 19, 2010 16:07:56 David Leverton wrote:
> On 19 July 2010 20:43, Mike Frysinger <[email protected]> wrote:
> > On Monday, July 19, 2010 03:38:39 Ciaran McCreesh wrote:
> >> On Sun, 18 Jul 2010 20:17:45 -0700 Alec Warner wrote:
> >> > Can we do away with all the extra foo && return bullshit and just set
> >> > a trap?
> >> > 
> >> > trap "eshopts pop" RETURN
> >> > 
> >> >  ?
> >> 
> >> That strikes me as a horribly fragile way of doing things that's bound
> >> to come back and screw things up at some point...
> > 
> > nifty in theory, but i'm inclined to agree with Ciaran
> 
> Is something like the below function too hideous (not massively
> tested, but it seems to work)?  Usage is something like:
> 
> [dlever...@shiny-one ~] $ foo() { shopt -p extglob; }
> [dlever...@shiny-one ~] $ eshopts_need foo -s extglob

i imagine this might be useful in some scenarios, but i think the more common 
usage is to enable things inline.  otherwise, the exported API would need to 
be wrapped internally like:
get_all_version_components() {
        eshopts_need _get_all_version_components -s extglob
}

and at this point, it's hard to say this is better than just doing:
get_all_version_components() {
        eshopts_push -s extglob
         _get_all_version_components 
        eshopts_pop
}

... or the existing code we have now.  although, the method we have now also 
allows for disabling of shopts before calling `die`.  not sure if that's 
important, but i think it's better to disable before all exit/termination 
points.

so unless their is a consumer now we can point to in the tree, i'm inclined to 
leave this alone.

> eshopts_need() {
>     [[ $# -ge 1 ]] || die "eshopts_need needs at least one argument"
>     local func=$1
>     shift
>     local opts=( "$...@}" )
>     if [[ $1 == -[su] ]] ; then
>         eval "_eshopts_need_shopt_$(declare -f $func)"
>         eval "$func() {
>             local old=\$(shopt -p)
>             $(declare -p opts)
>             shopt \"\${op...@]}\"
>             _eshopts_need_shopt_$func \"\...@\"
>             local status=\$?
>             eval \"\$old\"
>             return \$status
>         }"

there are already eshopts_push/pop funcs that accomodate more things than the 
usage here, but i imagine you did it this way just to make testing in your 
shell easier
-mike

Attachment: signature.asc
Description: This is a digitally signed message part.

Reply via email to