How do I set a user environment variable? (permanently, not session)
You have to put the declaration in the initialization files of your shell:
If you are using bash, ash, ksh or some other Bourne-style shell, you can add
ABC="123"; export ABC
in your
.profile
file (${HOME}/.profile
). This is the default situation on most Unix installations, and in particular on Debian.If your login shell is bash, you can use
.bash_profile
(${HOME}/.bash_profile
) or.bash_login
instead.Note: If either of these files exists and your login shell is bash,
.profile
is not read when you log in over ssh or on a text console, but it might still be read instead of.bash_profile
if you log in from the GUI. Also, if there is no.bash_profile
, then use.bashrc
.If you've set zsh as your login shell, use
~/.zprofile
instead of~/.profile
.If you are using tcsh, add
setenv ABC "123"
in
.login
file (${HOME}/.login
)if you are using another shell look at the shell manual how to define environment variables and which files are executed at the shell startup.
Use /etc/environment
file for setting the environment variables. Then add the following line inside the /etc/environment
file.
ABC="123"
Now the ABC variable will be accessible from all the user sessions. To test the variable output first refresh the environment variable using command
source /etc/environment
and run echo $ABC
.
This is a general procedure you can use for pretty much any shell. In any case, you have to know which shell the user would normally log in with:
path="$(grep $USER /etc/passwd | cut -d ':' -f 7)"
shell="$(basename -- "$path")"
Then you have to figure out which dot-files this shell would normally read:
man $shell
A shortcut which might work is to list those dot-files which contain the shell name:
ls ~/.*${shell}*
If you want to check if one of the files is actually read during login, you can simply print the file name in each of them, for example:
echo .bashrc
When logging in, you should then see which files are being read, and you can decide which one to modify. Beware that you should not to try to use echo "$0"
or similar, because the value of $0
depends on how the shell processes dot-files, and could be misleading.
When it comes to declaring the variable "permanently", note that this only extends to the session. There is no way to access the value of a variable without a session, so it has no meaning outside of one. If you mean "read-only", that is shell dependent, and in Bash you can use:
declare -r VAR
if it already has a value, or
declare -r VAR=value
to assign it at the same time. Not all shells have this feature.
To declare a variable in most shells, you should use a variable name ([A-Za-z_][A-Za-z0-9_]*
), followed by an equal sign (and no spaces around the equal sign), then a value (preferably quoted unless the value is a simple [A-Za-z0-9_]+
). For example:
name="John Doe"
ip=127.0.0.1
HORRIBLE=1