Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
Re: Factoring out code
- X-seq: zsh-users 9392
- From: DervishD <zsh@xxxxxxxxxxxx>
- To: Bart Schaefer <schaefer@xxxxxxxxxxxxxxxx>
- Subject: Re: Factoring out code
- Date: Tue, 6 Sep 2005 12:37:18 +0200
- Cc: Zsh Users <zsh-users@xxxxxxxxxx>
- In-reply-to: <1050905200819.ZM8987@xxxxxxxxxxxxxxxxxxxxxxx>
- Mail-followup-to: Bart Schaefer <schaefer@xxxxxxxxxxxxxxxx>, Zsh Users <zsh-users@xxxxxxxxxx>
- Mailing-list: contact zsh-users-help@xxxxxxxxxx; run by ezmlm
- Organization: DervishD
- References: <20050905114253.GA7132@DervishD> <1050905200819.ZM8987@xxxxxxxxxxxxxxxxxxxxxxx>
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
argv.
> } 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