|
Top Document: Unix - Frequently Asked Questions (2/7) [Frequent posting] Previous Document: Why do I get [some strange error message] when I "rsh host command" ? Next Document: How do I redirect stdout and stderr separately in csh? See reader questions & answers on this topic! - Help others by sharing your knowledge
2.8) 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.
A much more detailed answer prepared by
xtm@telelogic.se (Thomas Michanek) can be found at
ftp.wg.omron.co.jp in /pub/unix-faq/docs/script-vs-env.
User Contributions:Top Document: Unix - Frequently Asked Questions (2/7) [Frequent posting] Previous Document: Why do I get [some strange error message] when I "rsh host command" ? Next Document: How do I redirect stdout and stderr separately in csh? Part1 - Part2 - Part3 - Part4 - Part5 - Part6 - Part7 - Single Page [ Usenet FAQs | Web FAQs | Documents | RFC Index ] Send corrections/additions to the FAQ Maintainer: tmatimar@isgtec.com (Ted Timar)
Last Update March 27 2014 @ 02:12 PM
|

Comment about this article, ask questions, or add new information about this topic: