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

Re: Factoring out code

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

??  This sort of thing is done quite frequently in languages like PHP
that are used for writing web applications.  You should probably also
put all of these "include files" in a common subdirectory, so that you
typically write

    . inc/emulate.sh
    function help { ... }
    function doc { ... }
    . inc/common.sh

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.)

} 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.

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

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