Every Unix process maintains a list of variables called the environment. When a new process is created, it inherits the environment from the process that created it (its parent process). For typical Unix commands, the parent is usually the shell process.
All environment variables are character strings, i.e. sequences of characters. There are no other data types such as integer, float, Boolean, etc. There are some shell features for treating variables as numbers, but their values are always stored as character strings. For this reason, numeric operations in the shell are very inefficient.
Since the shell creates a new process whenever you run an external
command, the shell's environment can be used to pass
information to any command that you run. For example, text
editors, top, ls with
colorized output, and other programs that manipulate the terminal
screen,
need to know what type of terminal you are using. Different types
of terminals use different magic sequences
to move the cursor, change the foreground or background color,
clear the screen, scroll, etc. To provide this information, we set
the shell's environment variable TERM
to the
terminal type (usually "xterm"). When you run a command from
the shell, the new process inherits the shell's TERM
variable, and uses it to look up the correct magic sequences for your
terminal type.
PATH
is another important environment variable
which specifies a list of
directories containing external Unix commands. When you type
a command at the shell prompt, the shell checks the directories
listed in PATH
in order to find the command
you typed. For example, when you type the ls
command, the shell utilizes PATH
to
locate the program in /bin/ls
.
The directory names within in PATH are separated by colons. A simple
value for PATH
might be
/bin:/usr/bin:/usr/local/bin
. When you type
ls, the shell first checks for the existence
of /bin/ls
. If it does not exist, the
shell then checks for /usr/bin/ls
,
and so on, until it either finds the program or has checked all
directories in PATH
. If the program is
not found, the shell issues an error message such as
"ls: Command not found".
The printenv shows all of the environment variables currently set in your shell process.
shell-prompt: printenv BLOCKSIZE=K COLORTERM=xterm-256color DISPLAY=:0 HOME=/home/bacon LANG=C.UTF-8 LOGNAME=bacon PWD=/home/bacon SHELL=/bin/tcsh TERM=xterm-256color USER=bacon ...
Setting environment variables requires a different syntax depending on which shell you are using. Most modern Unix shells are extensions of either Bourne shell (sh) or C shell (csh), so there are only two variations of most shell commands that we need to know for most purposes.
For Bourne shell derivatives (sh, bash, dash, ksh, zsh), we use the export command:
shell-prompt: TERM=xterm shell-prompt: PATH='/bin:/usr/bin:/usr/local/bin' shell-prompt: export TERM PATH
For C shell derivatives (csh, tcsh), we use setenv:
shell-prompt: setenv TERM xterm shell-prompt: setenv PATH '/bin:/usr/bin:/usr/local/bin'
The env can be used to alter the environment
just for the invocation of one child process, rather than setting it
for the current shell process. Suppose Bob has a program called
rna-trans that uses
OpenMP threads
(multiple subprocesses running on separate cores to speed up the
program) and he would like to run it using two cores. OpenMP normally
uses all available cores, but we can limit it by setting the
environment variable OMP_NUM_THREADS
.
shell-prompt: env OMP_NUM_THREADS=2 rna-trans
Here, the env command sets
OMP_NUM_THREADS
, and then runs
rna-trans. Since the rna-trans
process is a child of the env process, it
inherits the entire environment, including
OMP_NUM_THREADS
.
You can create environment variables with any name and value you like. However, there are many environment variable names that are reserved for specific purposes. A few of the most common ones are listed in Table 3.14, “Reserved Environment Variables”.
Table 3.14. Reserved Environment Variables
Name | Purpose |
---|---|
TERM | Terminal type for an interactive shell session |
USER | User's login name |
HOME | Absolute path of the user's home directory (~) |
PATH | List of directories searched for commands |
LANG | Character set for the local language |
EDITOR | User's preferred interactive text editor |
What is the environment in Unix?
What data types are available for environment variables?
Does a Unix process have any environment variables when it starts? If so, where do they come from?
What is the purpose of the TERM environment variable? What kinds of programs make use of it?
What is the purpose of the PATH environment variable? What kinds of programs make use of it?
Show how to set the environment variable TERM to the value "xterm" in
Bourne shell (sh)
Korn shell (ksh)
Bourne again shell (bash)
C shell (csh)
T-shell (tcsh)
Show a Unix command that runs ls with the LSCOLORS environment variable set to "CxFxCxDxBxegedaBaGaCaD". You may not change the LSCOLORS variable for the current shell process.