From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 4442 invoked from network); 29 Dec 2002 19:23:45 -0000 Received: from sunsite.dk (130.225.247.90) by ns1.primenet.com.au with SMTP; 29 Dec 2002 19:23:45 -0000 Received: (qmail 15675 invoked by alias); 29 Dec 2002 19:23:40 -0000 Mailing-List: contact zsh-workers-help@sunsite.dk; run by ezmlm Precedence: bulk X-No-Archive: yes X-Seq: 18036 Received: (qmail 15662 invoked from network); 29 Dec 2002 19:23:39 -0000 From: "Bart Schaefer" Message-Id: <1021229192311.ZM23619@candle.brasslantern.com> Date: Sun, 29 Dec 2002 19:23:10 +0000 In-Reply-To: <3e0ec138.10c34e.5239@imap.qut.edu.au> Comments: In reply to "Mark Hessling" "Re: How to change environment from a module" (Dec 29, 7:32pm) References: <3e0ec138.10c34e.5239@imap.qut.edu.au> X-Mailer: Z-Mail (5.0.0 30July97) To: zsh-workers@sunsite.dk Subject: Re: How to change environment from a module MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii On Dec 29, 7:32pm, Mark Hessling wrote: } } [Bart wrote:] } > In general you shouldn't call bin_ functions directly. They } > should almost always be called only via the command execution } > code. } } Why should these functions not be called directly ? Because they often depend on the generic command setup that is performed in the execution code in exec.c. } > It's very likely that your module should call zgetdir(&ds) before } > running the Rexx program and call restoredir(&ds) after it. } } But this is the only reason for running a Rexx interpreter within the } current process of the shell; to change the environment permanently. I can think of other reasons, such as avoiding the overhead of repeated forks and of reloading the interpreter. } Based on this premise, then calling routines like zchdir() doesn't } go the whole way. ie if you have a chpwd() function in .zshrc, then } zchdir() doesn't call it. That's true -- zchdir() is a function meant to be called by the zsh internals at a lower level than the command interpreter. } So again, how should one call the bin_*() functions directly from a } module as though a "cd" command or "export" command were executed } directly by the user ? This is akin to asking how to attach a clutch pedal to an autmobile with an automatic transmission. Just because there's a clutch plate in there somewhere doesn't mean there's an easy way to bolt new a lever to it. In fact, you're trying to connect an entire second engine to the drive chain, and wondering why the chassis wasn't designed for that. The best suggestion I can give you is: sprintf(command, "\\builtin cd %s", bslashquote(dirname, NULL, 0)); execstring(command, 1, 0); Where it's up to you to be sure that the command buffer is large enough.