====== UNIX Tutorial Eight ======
===== 8.1 UNIX Variables =====
Variables are a way of passing information from the shell to programs when you run them. Programs look "in the environment" for particular variables and if they are found will use the values stored. Some are set by the system, others by you, yet others by the shell, or any program that loads another program.
Standard UNIX variables are split into two categories, **environment variables** and **shell variables**. In broad terms, shell variables apply only to the current instance of the shell and are used to set short-term working conditions; environment variables have a farther reaching significance, and those set at login are valid for the duration of the session. By convention, environment variables have UPPER CASE and shell variables have lower case names.
===== 8.2 Environment Variables =====
An example of an environment variable is the **OSTYPE** variable. The value of this is the current operating system you are using. Type
ubuntu@ubuntu:~$ echo $OSTYPE
More examples of environment variables are
* ''USER'' (your login name)
* ''HOME'' (the path name of your home directory)
* ''HOST'' (the name of the computer you are using)
* ''ARCH'' (the architecture of the computers processor)
* ''DISPLAY'' (the name of the computer screen to display X windows)
* ''PRINTER'' (the default printer to send print jobs)
* ''PATH'' (the directories the shell should search to find a command)
==== Finding out the current values of these variables. ====
ENVIRONMENT variables are set using the ''export'' command, displayed using the ''printenv'' or ''env'' commands, and unset using the ''unset'' command.
To show all values of these variables, type
ubuntu@ubuntu:~$ printenv | less
===== 8.3 Shell Variables =====
An example of a shell variable is the ''history'' variable. The value of this is how many shell commands to save, allow the user to scroll back through all the commands they have previously entered. Type
ubuntu@ubuntu:~$ echo $history
More examples of shell variables are
* ''cwd'' (your current working directory)
* ''home'' (the path name of your home directory)
* ''path'' (the directories the shell should search to find a command)
* ''prompt'' (the text string used to prompt for interactive commands shell your login shell)
==== Finding out the current values of these variables. ====
SHELL variables use of a simple assignment ''var="value"'', and displayed using the ''set'' command. They can be unset by using the ''unset'' command.
To show all values of these variables, type
ubuntu@ubuntu:~$ set | less
==== So what is the difference between PATH and path? ====
In general, environment and shell variables that have the same name (apart from the case) are distinct and independent, except for possibly having the same initial values. There are, however, exceptions.
Each time the shell variables ''home'', ''user'' and ''term'' are changed, the corresponding environment variables ''HOME'', ''USER'' and ''TERM'' receive the same values. However, altering the environment variables has no effect on the corresponding shell variables.
''PATH'' and ''path'' specify directories to search for commands and programs. Both variables always represent the same directory list, and altering either automatically causes the other to be changed.
===== 8.4 Using and setting variables =====
Each time you login to a UNIX host, the system looks in your home directory for initialisation files. Information in these files is used to set up your working environment. The bash shell uses two files called **.bash_profile** and **.bashrc** (note that both file names begin with a dot).
At login the bash shell first reads **.bash_profile** followed by **.bashrc**
**.bash_profile** is to set conditions which will apply to the whole session and to perform actions that are relevant only at login.
**.bashrc** is used to set conditions and perform actions specific to the shell and to each invocation of it.
The guidelines are to set ENVIRONMENT variables in the **.bash_profile** (using ''export'') file and SHELL variables in the **.bashrc** file.
NEVER put commands that run graphical displays (e.g. a web browser) in your **.bashrc** or **.bash_profile** file.
===== 8.5 Setting shell variables in the .bashrc file =====
For example, to change the number of shell commands saved in the history list, you need to set the environment variable ''history''. It is set to 500 by default, but you can decrease this if you wish.
ubuntu@ubuntu:~$ HISTSIZE=200
Check this has worked by typing
ubuntu@ubuntu:~$ echo $HISTSIZE
However, this has only set the variable for the lifetime of the
current shell. If you open a new ''xterm'' window, it will only have
the default history value set. To PERMANENTLY set the value of
''history'', you will need to add the set command to the **.bashrc**
file.
First open the **.bashrc** file in a text editor. An easy,
user-friendly editor to use is ''nano'' (if you prefer a notepad-like
textedit editor, use ''gedit'' instead((Because ''gedit'' is a
graphical application, you should launch it in the background using
''gedit ~/.bashrc &''))).
ubuntu@ubuntu:~$ nano ~/.bashrc
Add the following line AFTER the list of other commands.
HISTSIZE=200
Save the file and force the shell to reread its **.bashrc** file by
using the shell ''source'' command:
ubuntu@ubuntu:~$ source ~/.bashrc
Check this has worked by typing
ubuntu@ubuntu:~$ echo $HISTSIZE
===== 8.6 Setting the path =====
When you type a command, your ''path'' (or ''PATH'') variable defines in which
directories the shell will look to find the command you typed. If the
system returns a message saying "''//command//: Command not found''", this
indicates that either the command doesn't exist at all on the system
or it is simply not in your path.
For example, to run the ''units'' application that you compiled in the
[[eg-258:unix7|previous tutorial]], you either need to directly
specify the ''units'' path (**~/units185/bin/units**), or you need to have the
directory **~/units185/bin** in your path.
You can add it to the end of your existing path (the **''$PATH''**
variable represents this) by issuing the command:
ubuntu@ubuntu:~$ PATH=$PATH:~/units185/bin
Test that this worked by trying to run units in any directory other
that where units is actually located.
ubuntu@ubuntu:~$ cd; units
You can run multiple commands on one line by separating them
with a semicolon.
To add this path PERMANENTLY, add the following
line to your **.bashrc** AFTER the list of other commands.
PATH=$PATH:~/units185/bin
----
[[eg-253:unix7|{{eg-253:nav-left.gif|Previous}}]] [[eg-253:unixtut|{{eg-253:nav-home.gif|Home}}]]
--- //[[C.P.Jobling@Swansea.ac.uk|Dr Chris P. Jobling]] 2007/09/21 18:37//