From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 3747 invoked from network); 6 Sep 2005 10:33:24 -0000 Received: from news.dotsrc.org (HELO a.mx.sunsite.dk) (130.225.247.88) by ns1.primenet.com.au with SMTP; 6 Sep 2005 10:33:24 -0000 Received: (qmail 33836 invoked from network); 6 Sep 2005 10:33:18 -0000 Received: from sunsite.dk (130.225.247.90) by a.mx.sunsite.dk with SMTP; 6 Sep 2005 10:33:17 -0000 Received: (qmail 1632 invoked by alias); 6 Sep 2005 10:33:08 -0000 Mailing-List: contact zsh-users-help@sunsite.dk; run by ezmlm Precedence: bulk X-No-Archive: yes X-Seq: 9392 Received: (qmail 1620 invoked from network); 6 Sep 2005 10:33:07 -0000 Received: from news.dotsrc.org (HELO a.mx.sunsite.dk) (130.225.247.88) by sunsite.dk with SMTP; 6 Sep 2005 10:33:07 -0000 Received: (qmail 32717 invoked from network); 6 Sep 2005 10:33:07 -0000 Received: from ns9.hostinglmi.net (213.194.149.146) by a.mx.sunsite.dk with SMTP; 6 Sep 2005 10:33:02 -0000 Received: from 212.red-80-35-44.pooles.rima-tde.net ([80.35.44.212]:32769 helo=localhost) by ns9.hostinglmi.net with esmtpa (Exim 4.52) id 1ECalC-0005CF-Js; Tue, 06 Sep 2005 12:33:03 +0200 Date: Tue, 6 Sep 2005 12:37:18 +0200 From: DervishD To: Bart Schaefer Cc: Zsh Users Subject: Re: Factoring out code Message-ID: <20050906103718.GB63@DervishD> Mail-Followup-To: Bart Schaefer , Zsh Users References: <20050905114253.GA7132@DervishD> <1050905200819.ZM8987@candle.brasslantern.com> Mime-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <1050905200819.ZM8987@candle.brasslantern.com> User-Agent: Mutt/1.4.2.1i Organization: DervishD X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - ns9.hostinglmi.net X-AntiAbuse: Original Domain - sunsite.dk X-AntiAbuse: Originator/Caller UID/GID - [0 0] / [47 12] X-AntiAbuse: Sender Address Domain - dervishd.net X-Source: X-Source-Args: X-Source-Dir: X-Spam-Checker-Version: SpamAssassin 3.0.4 (2005-06-05) on f.primenet.com.au X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.0.4 Hi Bart :) * Bart Schaefer 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 "$( > 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...