From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 4876 invoked from network); 5 Sep 2004 13:34:48 -0000 Received: from news.dotsrc.org (HELO a.mx.sunsite.dk) (130.225.247.88) by ns1.primenet.com.au with SMTP; 5 Sep 2004 13:34:48 -0000 Received: (qmail 88810 invoked from network); 5 Sep 2004 13:34:42 -0000 Received: from sunsite.dk (130.225.247.90) by a.mx.sunsite.dk with SMTP; 5 Sep 2004 13:34:42 -0000 Received: (qmail 9490 invoked by alias); 5 Sep 2004 13:33:58 -0000 Mailing-List: contact zsh-users-help@sunsite.dk; run by ezmlm Precedence: bulk X-No-Archive: yes X-Seq: 7976 Received: (qmail 9479 invoked from network); 5 Sep 2004 13:33:58 -0000 Received: from unknown (HELO a.mx.sunsite.dk) (130.225.247.88) by sunsite.dk with SMTP; 5 Sep 2004 13:33:58 -0000 Received: (qmail 87191 invoked from network); 5 Sep 2004 13:32:58 -0000 Received: from madrid10.amenworld.com (62.193.203.32) by a.mx.sunsite.dk with SMTP; 5 Sep 2004 13:32:57 -0000 Received: from DervishD.pleyades.net (212.Red-80-35-44.pooles.rima-tde.net [80.35.44.212]) by madrid10.amenworld.com (8.10.2/8.10.2) with ESMTP id i85DWs112911 for ; Sun, 5 Sep 2004 15:32:55 +0200 Received: from disposable1@telefonica.net by DervishD.pleyades.net with local (Exim MTA 2.05) id <1C3x8y-0003VR-00>; Sun, 5 Sep 2004 15:33:20 +0200 Date: Sun, 5 Sep 2004 15:33:20 +0200 From: DervishD To: zsh-users@sunsite.dk Subject: Re: Making a script 'sourceable' Message-ID: <20040905133320.GE13462@DervishD> Mail-Followup-To: zsh-users@sunsite.dk References: <20040904110724.GA12874@DervishD> Mime-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: User-Agent: Mutt/1.4.2.1i Organization: Pleyades X-Spam-Checker-Version: SpamAssassin 2.63 on a.mx.sunsite.dk X-Spam-Level: X-Spam-Status: No, hits=-0.0 required=6.0 tests=BAYES_44 autolearn=no version=2.63 X-Spam-Hits: -0.0 Hi Bart :) * Bart Schaefer dixit: > > > > The second thing is derived from the above question: since > > > > checking for 'sourcery' ;) is very difficult even non portably, I've > > > > thought about making my zsh scripts sourceables. > > > Lloyd Z. has the way of it. > > Well, an extra fork... I don't really like that method, but... > There's also this, wherein a function name unlikely to exist in the > calling shell is invented and then that function destroys itself as soon > as it is invoked: > > --- 8< --- > #! bin/zsh > function __the_real_script_$$ { > unfunction __the_real_script_$$ > emulate -LR zsh > # body of script goes here, using "local" to control variables > } > __the_real_script_$$ "$@" > --- >8 --- > > However, that pretty thoroughly demolishes the usefulness of $0, and any > error messages that are printed will fail to show the name of the script > and the line numbers will be "wrong". So the method pointed by Lloyd is more suitable... > On the other hand this (and the subshell wrapper variant, too) has the > advantage that the entire script is parsed for syntax before any of it is > executed, so if you make a mistake somewhere you don't have half-finished > script processing to clean up. Yes, I noticed that this morning, doing tests :)) For me that pays for the extra fork. > Back on the first hand again, though, you pay the memory cost of that > parse on every call to the script. Usually the scripts are quite short: in fact, that's the reason that made me think about auditing the scripts to avoid side-effects when the script is sourced instead of run in a subshell. Thanks a lot for your help. I probably end up doing the '()' thing, because the extra fork really is not very expensive, the only problem is 'ps' output cluttering ;) Raúl Núñez de Arenas Coronado -- Linux Registered User 88736 http://www.pleyades.net & http://raul.pleyades.net/