Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: Factoring out code

    Hi Bart :)

 * Bart Schaefer <schaefer@xxxxxxxxxxxxxxxx> dixit:
> On Sep 5,  1:42pm, DervishD wrote:
> }     How can I make "common.sh" to run code BEFORE and AFTER some
> } point in the script which sources it
> Have you considered splitting common.sh into two files, the first called
> (for example) emulate.sh and the second common.sh, and then start the
> rest of your scripts with (again for example)
>     . emulate.sh
>     function help { ... }
>     function doc { ... }
>     . common.sh

    Yes, I've considered it, but it's my last resort, I prefer just
one file, it's easier to maintain (otherwise I have to decide where
should I put new code, in emulate or in common).
> Another approach would be to have common.sh define a bunch of variables
> whose contents are snippets of shell code; e.g.
>     . common.sh
>     function help { ... }
>     function doc { ... }
>     eval ${_common_parse_argv:?'common.sh not sourced'}
> (See the manual for ${name:?message} semantics.)

    That's a bit messy, too, using eval and the like. Looks like I'm
going to make syntax errors everytime I use it O:) OTOH, making
"_common_parse_argv" a function won't work since it has to modify

> } if that code must modify global
> } variables in the caller and work like a cut'n'paste (I mean, for the
> } 'sourcer' script the code should run like if was cut from "common.sh"
> } and pasted into the file, just like a macro)?
> You have to be careful with this unless you're doing something like
>     eval "$(<inc/common.sh)"
> because the argv array CAN become local to a sourced file.  If you pass
> multiple arguments to the dot or source commands, as in
>     . foo.sh bar baz
> then argv becomes a local with value (bar baz) in foo.sh, just as it
> would in a function, and e.g. `set -- ...' no longer affects the argv
> of the caller.

    Yes, I know, while I was trying combinations I noticed that,
thanks for pointing :)

> By the way, 'typeset -gx argv' has no effect whatsoever.  You cannot
> cause argv to change from local to global under any circumstances.

    Oops, that's true, but I swear that didn't work when I first
tested, obviously I made some mistake. Thanks :)

    So, how can I make a function to use the *global* argv and not
the local one? Can a function modify the global argv?

    Thanks a lot for your answer, Bart :)

    Raúl Núñez de Arenas Coronado

Linux Registered User 88736 | http://www.dervishd.net
http://www.pleyades.net & http://www.gotesdelluna.net
It's my PC and I'll cry if I want to...

Messages sorted by: Reverse Date, Date, Thread, Author