Can a shell script set environment variables of the calling shell?


I'm trying to write a shell script that, when run, will set some environment variables that will stay set in the caller's shell.

setenv FOO foo

in csh/tcsh, or

export FOO=foo

in sh/bash only set it during the script's execution.

I already know that

source myscript

will run the commands of the script rather than launching a new shell, and that can result in setting the "caller's" environment.

But here's the rub:

I want this script to be callable from either bash or csh. In other words, I want users of either shell to be able to run my script and have their shell's environment changed. So 'source' won't work for me, since a user running csh can't source a bash script, and a user running bash can't source a csh script.

Is there any reasonable solution that doesn't involve having to write and maintain TWO versions on the script?

8/31/2018 4:20:09 PM

Accepted Answer

Your shell process has a copy of the parent's environment and no access to the parent process's environment whatsoever. When your shell process terminates any changes you've made to its environment are lost. Sourcing a script file is the most commonly used method for configuring a shell environment, you may just want to bite the bullet and maintain one for each of the two flavors of shell.

6/5/2014 2:43:25 PM

Use the "dot space script" calling syntax. For example, here's how to do it using the full path to a script:

. /path/to/

And here's how to do it if you're in the same directory as the script:


These execute the script under the current shell instead of loading another one (which is what would happen if you did ./ Because it runs in the same shell, the environmental variables you set will be available when it exits.

This is the same thing as calling source, but it's shorter to type and might work in some places where source doesn't.

Licensed under: CC-BY-SA with attribution
Not affiliated with: Stack Overflow