From: Tom Christiansen <tchrist@convex.COM>
Subject: Re: How can process cd to a dir and stay there when exits
Originator: tchrist@pixel.convex.com
Date: Thu, 20 Aug 1992 13:13:45 GMT
Reply-To: tchrist@convex.COM (Tom Christiansen)
Organization: Convex Computer Corporation, Colorado Springs, CO
X-Disclaimer: This message was written by a user at CONVEX Computer
              Corp. The opinions expressed are those of the user and
              not necessarily those of CONVEX.

From the keyboard of mpalmer@encore.com (Mike Palmer):
:Can anyone suggest a way for a process to cd to a dir & stay there when the \
:process exits.
:
:I have a ksh solution using an alias, a script & the program, but I'd like
:to do it just with a program, or at least a script & program than will work
:under csh & ksh.

FAQqed again.

--tom


14) How do I {set an environment variable, change directory} inside a
      program or shell script and have that change affect my
      current shell?

    In general, you can't, at least not without making special
    arrangements.  When a child process is created, it inherits a copy
    of its parent's variables (and current directory).  The child can
    change these values all it wants but the changes won't affect the
    parent shell, since the child is changing a copy of the 
    original data.

    Some special arrangements are possible.  Your child process could
    write out the changed variables, if the parent was prepared to read
    the output and interpret it as commands to set its own variables.

    Also, shells can arrange to run other shell scripts in the context
    of the current shell, rather than in a child process, so that
    changes will affect the original shell.

    For instance, if you have a C shell script named "myscript":

        cd /very/long/path
        setenv PATH /something:/something-else

    or the equivalent Bourne or Korn shell script

        cd /very/long/path
        PATH=/something:/something-else export PATH

    and try to run "myscript" from your shell, your shell will fork and run
    the shell script in a subprocess.  The subprocess is also
    running the shell; when it sees the "cd" command it changes
    *its* current directory, and when it sees the "setenv" command
    it changes *its* environment, but neither has any effect on the current
    directory of the shell at which you're typing (your login shell,
    let's say).

    In order to get your login shell to execute the script (without forking)
    you have to use the "." command (for the Bourne or Korn shells)
    or the "source" command (for the C shell).  I.e. you type

        . myscript
    
    to the Bourne or Korn shells, or

        source myscript

    to the C shell.

    If all you are trying to do is change directory or set an
    environment variable, it will probably be simpler to use a
    C shell alias or Bourne/Korn shell function.  See the "how do
    I get the current directory into my prompt" section
    of this article for some examples.



-- 
    Tom Christiansen      tchrist@convex.com      convex!tchrist
Unix is like a toll road on which you have to stop every 50 feet to
pay another nickel.  But hey!  You only feel 5 cents poorer each time.
	--Larry Wall in <1992Aug13.192357.15731@netlabs.com>