What are PATH and other environment variables, and how can I set or use them?
Solution 1:
What are Environment Variables?
Environment variables hold values related to the current environment, like the Operating System or user sessions.
Path
One of the most well-known is called PATH
on Windows, Linux and Mac OS X. It specifies the directories in which executable programs* are located on the machine that can be started without knowing and typing the whole path to the file on the command line. (Or in Windows, the Run dialog in the Start Menu or +R).
On Linux and Mac OS X, it usually holds all bin
and sbin
directories relevant for the current user. On Windows, it contains at least the C:\Windows
and C:\Windows\system32
directories — that's why you can run calc.exe
or notepad.exe
from the command line or Run dialog, but not firefox.exe
. (Firefox is located in C:\Program Files\Mozilla Firefox
. For information on how to include Firefox, go here.)
For example, typing calc
(the .exe
can be omitted) in the command line on Windows will start up the Windows Calculator.
* You can add support for file extensions other than .exe
by editing %PATHEXT%
.
Other
Other variables might tell programs what kind of terminal is used (TERM
on Linux/Mac OS X), or, on Windows, where the Windows folder is located (e.g., %WINDIR%
is C:\Windows
).
Creating new environment variables
In Windows, Linux and Unix, it's possible to create new environment variables, whose values are then made available to all programs upon launch.
You can use this when writing scripts or programs that are installed or deployed to multiple machines and need to reference values that are specific to these machines. While a similar effect can be achieved using program-specific configuration settings, it's easier to do this using an environment variable if multiple programs need to access the same value.
Windows
GUI
Open
Control Panel » System » Advanced » Environment Variables
.-
Type
control sysdm.cpl,,3
in the Run dialog (+R) and clickEnvironment Variables
.
For editing user variables you can also type%windir%\System32\rundll32.exe sysdm.cpl,EditEnvironmentVariables
in the Run dialog.
-
Right-click (My) Computer and click on Properties, or simply press +Break.
- In XP click on
Advanced » Environment Variables
. - In Vista+ click on
Advanced system settings » Environment Variables
.
- In XP click on
There are many other ways of reaching the same place, such as by typing "environment variables" in the Start Menu/Screen search box and so on.
Environment variables in Windows are separated into user and machine/system specific values. You can view and edit their values there. Their current values upon launch are made available to all programs.
There is also Rapid Environment Editor, which helps setting and changing environment variables in Windows without the need to go deep into the system settings. Another open source program for Windows with which the path environment can be edited very conveniently is Path Editor.
Command Line
Format
Environment Variables in Windows are denoted with percent signs (%) surrounding the name:
%name%
echo
To display an environment variable's value in cmd.exe
, type echo %name%
.
C:\>echo %USERPROFILE%
C:\Users\Daniel
set
To create/set a variable, use set varname=value
:
C:\>set FunnyCatPictures=C:\Users\Daniel\Pictures\Funny Cat Pictures
C:\>set FunnyCatPicturesTwo=%USERPROFILE%\Pictures\Funny Cat Pictures 2
To append/add a variable, use set varname=value;%varname%
:
C:\>set Penguins=C:\Linux
C:\>set Penguins=C:\Windows;%Penguins%
C:\>echo %Penguins%
C:\Windows;C:\Linux
Environment variables set in this way are available for (the rest of) the duration of the Command Prompt process in which they are set, and are available to processes that are started after the variables were set.
setx
To create/set a variable permanently, use setx varname "value"
:
C:\>setx FunnyCatPictures "C:\Users\Daniel\Pictures\Funny Cat Pictures"
[Restart CMD]
C:\>echo %FunnyCatPictures%
C:\Users\Daniel\Pictures\Funny Cat Pictures
Unlike set
, there is no equals sign and the value should be enclosed in quotes if it contains any spaces. Note that variables may expand to a string with spaces (e.g., %PATH%
becomes C:\Program Files
), so it is best to include quotes around values that contain any variables.
You must manually add setx
to versions of Windows earlier than Vista.
Windows XP Service Pack 2 Support Tools
List of Windows Environment Variables
Here is a list of default environment variables, which are built into Windows. Some examples are:
%WINDIR%
, %SystemRoot%
, %USERPROFILE%
, and %APPDATA%
.
Like most names in Windows, these are case-insensitive.
Unix derivatives (FreeBSD, GNU / Linux, OS X)
Environment Variables in Linux are prefixed with a dollar sign ($) such as $HOME or $HOSTNAME. Many well-known and standard variables are spelled out in capital letters to signify just that. Keep in mind that variable names are case-sensitive, meaning that $User and $USER are entirely unrelated from the shell's point of view.
Unix derivatives define system wide variables in shell scripts located mostly in the /etc
folder, but user-specific values may be given to those variables in scripts located in the home folder (e.g., /etc/profile
, $HOME/.bash_profile
). The .profile
file in the home folder is a common place to define user variables.
Setting variables
These files are regular shell scripts and can contain more than just environment variable declarations. To set an environment variable, use export
. To show your currently defined environment variables in a terminal, run env
.
The export
command is a standard way to define variables. The syntax is very intuitive. The outcome is identical for these two lines, but the first alternative is preferable in case portability to pre-POSIX Bourne shell is necessary.
var=value; export var
export var=value
The C shell and its descendants use a completely different syntax; there, the command is setenv
.
See the Linux documentation project, Path HOWTO for a more thorough discussion on this topic.
Perhaps contrary to common belief, OS X is more "Unix" than Linux. Additionally to the files already mentioned, $PATH can be modified in these files:
-
/etc/paths
contains all default directories that are added to the path, like/bin
and/usr/sbin
. - Any file in
/etc/paths.d
— commonly used by installers to make the executable files they provide available from the shell without touching system-wide or user-specific configuration files. These files simply contain one path per line. e.g., /Programs/Mozilla/Calendar/bin.
External Links:
Environment Variables in XP
Windows XP Service Pack 2 Support Tools (Includessetx
)
Environment Variables in Windows Vista and Windows 7
Adding executables to the Run Dialog Box
Mac OSX Tips - Setting Environment Variables
TLDP: Path Howto
Solution 2:
This post is from a more technical point of view than Daniel's, but doesn't explain as much the concepts.
The Wikipedia article is also an excellent referrence.
Linux and most BSDs
In most command-line shells, temporary environment variables are set using export
(sh, bash, zsh) or setenv
(csh, tcsh) commands.
-
Examples for prepending
$HOME/bin
to$PATH
in bash or zsh:export PATH="$HOME/bin:$PATH"
(In this particular case,
export
is unnecessary sincePATH
is already part of the environment.) -
csh, tcsh:
setenv PATH "$HOME/bin:$PATH"
Persistent environment variables can be set during several separate stages:
-
Login:
Login session setup: Linux
pam_env
, which usually reads from/etc/environment
-
Terminal logins: The shell's "profile" files.
-
bash
uses/etc/profile
and the first one of:~/.bash_profile
,~/.bash_login
,~/.profile
. Manual pagebash(1)
section Invocation.Often, the user's profile file includes an explicit call for
~/.bashrc
too. zsh
: Manual pagezsh(1)
section Startup/shutdown files.csh
and other shells: See apropriate manual pages.
-
Graphical logins: Not sure; may vary depending on login manager. GDM appears to read
~/.profile
in my system.
-
Opening of a terminal window:
-
bash
uses/etc/bash.bashrc
and~/.bashrc
.
-
Windows NT series
-
In Command Prompt (
cmd.exe
), useset name=value
to change environment variables for that window.To append
c:\bin
to%PATH%
, use:set path=%path%;c:\bin
This only affects that
cmd.exe
process, and any new processes launched from it. -
To make persistent changes, use Control Panel → System → Advanced → Environment Variables. (docs)
Note: While user settings normally override system ones,
PATH
variable is handled specially: both system and user settings are merged into the final value.Changes are stored to Registry (see below), and apply instantly to all new processes created by Explorer (the graphical shell), for example, through Start Menu.
-
System-wide environment variables are kept in the Registry,
HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
, and loaded at system boot.User environment is kept in
HKCU\Environment
and loaded during user logon. By default, the system also looks for
set
commands inAUTOEXEC.NT
file.
MS-DOS, 16-bit Windows, Windows 9x series
-
In MS-DOS Prompt (
command.com
), useset name=value
, as in WinNT.Similarly, running
set
interactively only affects that onecommand.com
instance, along with any new processes launched from it. -
To make persistent changes, add or edit apropriate
set
lines inC:\AUTOEXEC.BAT
, then reboot.- Workaround to avoid restarting, for Windows 9x: open a MS-DOS Prompt window, set the apropriate variables, close existing Explorer process (Start → Shut Down → while holding Ctrl+Shift, click Cancel), run
explorer.exe
from the MS-DOS Prompt window.
- Workaround to avoid restarting, for Windows 9x: open a MS-DOS Prompt window, set the apropriate variables, close existing Explorer process (Start → Shut Down → while holding Ctrl+Shift, click Cancel), run
VMS
(Couldn't resist.)
DCL has no concept of "path", but various symbol and command definitions can be put in SYS$LOGIN:LOGIN.COM
.