<?xml version="1.0" encoding="ISO-8859-1"?><html xmlns="http://www.w3.org/1999/xhtml" xmlns:xh="http://www.w3.org/1999/xhtml" xmlns:axle="http://www.cs.odu.edu/~zeil/axle" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ns0="http://www.cs.odu.edu/~zeil/axle" mode="ignore" ns0:xlinkuri="open/unix.dbk" ns0:xpath="/html" ns0:page="unix" foo="0 " ns0:last="/cocoon/~cs252/open/unix/section-8.2.html"><head><title>An Introduction to Unix</title><link type="text/css" href="_axle/docbookstyle.css" rel="stylesheet"/><link type="text/css" href="_axle/cppformat.css" rel="stylesheet"/><link type="text/css" href="_axle/overrides.css" rel="stylesheet"/><script src="_axle/docbook.js"/><link href="http://cocoon.cs.odu.edu:80/cocoon/~cs252/open/unix/section-2.3.html" title="Next" rel="next"/><link href="http://cocoon.cs.odu.edu:80/cocoon/~cs252/open/unix/section-2.html" title="Prev" rel="prev"/><link href="http://cocoon.cs.odu.edu:80/cocoon/~cs252/open/unix/section-2.html" title="Up" rel="up"/><link href="http://cocoon.cs.odu.edu:80/cocoon/~cs252/open/unix/unix.html" title="First" rel="first"/><link href="http://cocoon.cs.odu.edu:80/cocoon/~cs252/open/unix/section-8.2.html" title="Last" rel="last"/><script>function gotoNext() {top.location.href="/cocoon/~cs252/open/unix/section-2.3.html";}
function gotoPrev() {top.location.href="/cocoon/~cs252/open/unix/section-2.html";}
function gotoUp() {top.location.href="/cocoon/~cs252/open/unix/section-2.html";}
</script><xhtml:link xmlns:xhtml="http://www.w3.org/1999/xhtml" rel="stylesheet" href="_axle/navigation.css" type="text/css"/><xhtml:script xmlns:xhtml="http://www.w3.org/1999/xhtml" src="_axle/navigation.js"/></head><body><table width="100%" class="navigationBar"><tr class="navigationBar"><td width="5%" class="navigationBar"><a class="navigationBarArrow" title="First" href="http://cocoon.cs.odu.edu:80/cocoon/~cs252/open/unix/unix.html"><img class="navigationBar" src="_axle/first.gif" alt="First"/></a></td><td width="5%" class="navigationBar"><a class="navigationBarArrow" title="Prev" href="http://cocoon.cs.odu.edu:80/cocoon/~cs252/open/unix/section-2.html"><img class="navigationBar" src="_axle/prev.gif" alt="Prev"/></a></td><td width="5%" class="navigationBar"><a class="navigationBarArrow" title="Up" href="http://cocoon.cs.odu.edu:80/cocoon/~cs252/open/unix/section-2.html"><img class="navigationBar" src="_axle/up.gif" alt="Up"/></a></td><td width="5%" class="navigationBar"><a class="navigationBarArrow" title="Next" href="http://cocoon.cs.odu.edu:80/cocoon/~cs252/open/unix/section-2.3.html"><img class="navigationBar" src="_axle/next.gif" alt="Next"/></a></td><td width="5%" class="navigationBar"><a class="navigationBarArrow" title="Last" href="http://cocoon.cs.odu.edu:80/cocoon/~cs252/open/unix/section-8.2.html"><img class="navigationBar" src="_axle/last.gif" alt="Last"/></a></td><td class="navigationBar"/><td width="5%" class="navigationBar"><a class="navigationBar" title="CS252 Home" href="http://cocoon.cs.odu.edu:80/cocoon/~cs252/directory/announcements.html"><img class="navigationBar" src="_axle/home.gif" alt="CS252 Home"/></a></td><td width="5%" class="navigationBar"><a class="navigationBar" title="discuss this page" href="http://cocoon.cs.odu.edu:80/cocoon/~cs252/forum/getXPath/open/unix/section-2.2.html"><img class="navigationBar" src="_axle/forum.gif" alt="discuss this page"/></a></td></tr></table><br/><script type="text/javascript">
checkForAnchorOnOtherPage('section-1','unix');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('mainmini','mainmini');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('section-1.1.1','mainmini');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('displays','mainmini');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('networks','mainmini');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('taleof2','taleof2');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('section-1.2.1','taleof2');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('pcrev','taleof2');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref1','taleof2');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref1_live','taleof2');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref2','taleof2');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref2_live','taleof2');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fnote1','taleof2');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fnote2','taleof2');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('mswin','taleof2');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('reflections','reflections');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref3','reflections');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref3_live','reflections');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fnote3','reflections');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('ssh','ssh');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref4','ssh');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref4_live','ssh');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('puttyConnect','ssh');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('sshConnect','ssh');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fnote4','ssh');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('login','login');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('termtypes','termtypes');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref5','termtypes');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref5_live','termtypes');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fnote5','termtypes');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('section-1.7','section-1.7');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('section-1.8','section-1.8');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('section-2','section-2');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('section-2.1','section-2');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref6','section-2');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref6_live','section-2');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref7','section-2');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref7_live','section-2');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('basicFileCmds','section-2');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref8','section-2');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref8_live','section-2');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fnote8','section-2');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('cmdlist','section-2');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('session','section-2');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('rlogin','section-2');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('filemanip','section-2');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('cdcmd','section-2');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('findcmd','section-2');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('lsa','section-2');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('lsF','section-2');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('pwdcmd','section-2');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('textmanip','section-2');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('catcmd','section-2');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('morecmd','section-2');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('printing','section-2');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fnote6','section-2');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fnote7','section-2');
</script><div class="sect2" id="section-2.2" ns0:xpath="//*[@id='section-2.2']" ns0:page="section-2.2" ns0:next="/cocoon/~cs252/open/unix/section-2.3.html" ns0:prev="/cocoon/~cs252/open/unix/section-2.html" ns0:up="/cocoon/~cs252/open/unix/section-2.html" foo="0 " ns0:last="/cocoon/~cs252/open/unix/section-8.2.html" ns0:first="/cocoon/~cs252/open/unix/unix.html"><div class="info_sect2"><div class="title_sect3">2.2. Basic Commands</div></div><div class="TOC">Contents:<div class="TOC-section2"><a href="#paths">2.2.1 Command Arguments</a></div><div class="TOC-section2"><a href="#specialChar">2.2.2 Special Characters</a></div><div class="TOC-section2"><a href="#cmdpatterns">2.2.3 One Pattern, Many Instances</a></div><div class="TOC-section3"><a href="#wildcards">2.2.3.1 Wild Cards</a></div><div class="TOC-section3"><a href="#regexp">2.2.3.2 Regular Expressions</a></div><div class="TOC-section2"><a href="#quoting">2.2.4 Quoting</a></div></div><p class="para">To run a Unix command (or any program, for that matter), you normally
must type the name of the command/program file followed by any
arguments.  There is actually a program running that accepts your
keystrokes and launches the appropriate program. The program that
reads and interprets your keystrokes is called the <span class="emphasis">shell</span>.
There are many shells available, all of which offer different
features. The default shell for ODU CS is called tcsh, and we'll
concentrate on that.</p><p class="para">The command/program name is usually not given as a full
file name. Instead, certain directories, such as <span class="code">/bin</span>, are
automatically searched for a program of the appropriate name. This set of directories is referred to as your <span class="quote">
      &#8220;execution path&#8221;
    </span>
New accounts are set up so that the directories holding the most commonly used  Unix commands and programs are already in the execution path.<a onmouseover="DBshowBriefly('fn_fref9_live')" name="fn_fref9" id="fn_fref9" class="footnotemark" href="#fn_fnote9">9</a><div class="footnote_live" id="fn_fref9_live">You can see your path by giving the command
<div class="programlisting">
echo $PATH
</div>
And you can <a href="../custom/">modify your <span class="code">$PATH</span></a>, if desired, to add additional directories.
</div>
Thus,
one can invoke the <span class="code">ls</span> command as
<div class="screen"><span class="userinput">
   /bin/ls
</span></div>
but it's usually simpler to say
<div class="screen"><span class="userinput">
   ls
</span></div></p><div class="sect3" id="paths"><div class="info_sect3"><div class="title_sect4">2.2.1. Command Arguments</div></div>
    
    <p class="para">Of course, most Unix commands consist not only of the program name but also require one or more command arguments. The command arguments indicate the details of the desired operation, including files to work with, text to use, etc.
</p>
    <p class="para">Command arguments tend to come in four varieties:
<div class="orderedlist"><ol><li>File names: If a command needs to operate on one or more files,
then we specify those files by giving a <span class="firstterm">path</span> to the file -
a sequence of directories that we can follow to reach the file, ending
with the file name itself.
<p class="para">A path may be <span class="firstterm">absolute</span>, meaning that it begins with the
root directory <span class="code">/</span> or with someone's home directory
(starting with <span class="code">~</span>). Alternatively, a path can be
<span class="firstterm">relative</span>, meaning that it is interpreted in terms of your
current working directory.
</p>

<div class="informalexample"><div class="title_example">Try This:</div><p class="para">Log in and give the command
<div class="programlisting">
cd ~/playing
</div>
</p><p class="para">Now your current
working directory should be <span class="code">~/playing</span> and one of the files
in that directory should be <span class="code">math.h</span>. If you wanted to
refer to that file in a command argument, you could do so using of relative paths or absolute paths.
</p><p class="para">Give the commands
<div class="programlisting">
ls -l /home/<span class="emphasis">yourLoginName</span>/playing/math.h
ls -l ~/playing/math.h
ls -l ~<span class="emphasis">yourLoginName</span>/playing/math.h
ls -l math.h
ls -l ./math.h
ls -l ../playing/math.h
</div>
The first three are absolute paths. The last two are relative paths. Note that they all refer to the same file.<a onmouseover="DBshowBriefly('fn_fref10_live')" name="fn_fref10" id="fn_fref10" class="footnotemark" href="#fn_fnote10">10</a><div class="footnote_live" id="fn_fref10_live">In fact, there are an infinite
number of relative paths for most files, though most are pretty silly,
e.g., <span class="code">../playing/../playing/./././math.h</span>.</div></p><p class="para">If you aren't convinced that all of the above referred you to the same file, repeat the above commands using <span class="code">more</span> instead ot <span class="code">ls -l</span>.</p></div>


<p class="para">
If you change your working directory, e.g., 
<div class="programlisting">
cd ~
</div>
then you can refer to that same file using the same absolute paths
<span class="code">/home/<span class="emphasis">yourLoginName</span>/playing/math.h</span>,
<span class="code">~/playing/math.h</span>, or
<span class="code">~<span class="emphasis">yourLoginName</span>/playing/math.h</span> because
absolute paths do not depend on your current directory. You can also
use relative paths, but these would be different than before because
your current directory is different:  e.g.,
<span class="code">playing/math.h</span>.
</p>

<div class="informalexample"><div class="title_example">Try This:</div><p class="para">
<div class="programlisting">cd ~
ls -l ~/playing/math.h
ls -l math.h
ls -l ../playing/math.h
ls -l playing/math.h
</div>
The first <span class="code">ls</span> still works because it uses an absolute path. Absolute paths are unaffected by your current working directory. The next two <span class="code">ls</span> commands fail, because they were relative paths that made sense when your current working directory was <span class="filename">~/playing</span>, but not when your current working directory is <span class="filename">~</span>. The last <span class="code">ls</span> works as it uses a relative path that makes sense from your current working directory. (<span class="emphasis">Why?</span> Use <span class="code">ls</span> to explore your current directory and make sure you understand why some of these relative paths work and others fail.)
</p></div>


</li><li>
  <p class="para">
    Directory names: these are also specified using absolute and
relative paths. In fact, a directory in Unix is also a file - it's
just a file whose special contents include a list of other files. This
means that most Unix commands that expect a file can be given a
directory as well. But in many cases that won't do what we want.
</p>

<div class="informalexample"><div class="title_example">Try This:</div><div style="clear:right;"/><table class="sidebar" border="1" width="40%"><tr><td>
<p class="para">
The <span class="code">more</span> command lists the contents of a file, a page at
a time. Use the space bar to move forward a page, 'b' to move back a page, and use 'q' to quit.
</p>
</td></tr></table><p class="para">
<div class="programlisting">cd ~
more playing/math.h
more playing
</div>

As you can see, trying to list the contents of a directory file is
not useful.
</p></div>



<p class="para">
There are a few commands that work only on
directories. <span class="code">mkdir</span> (create an empty directory) and
<span class="code">rmdir</span> (remove a directory, if empty) are the most common.
</p>
<p class="para">In other cases, commands may work with either files or directories,
but have slightly different behaviors in the two cases. The
<span class="code">cp</span> command is a good example of this. 

<div class="informalexample"><div class="title_example">Try This:</div><div class="programlisting">cd ~/playing
cp yesno.h g1
ls
cp math.h g1
ls
rm g1
mkdir g1
cp math.h g1
ls
ls g1
</div><p class="para">
The three <span class="code">cp</span> commands are almost identical. In the first
case, we copied a file to a path that did not indicate an existing
file (<span class="code">g1</span>). So <span class="code">cp</span> created a copy with that
name. The second <span class="code">cp</span> copies to a path (<span class="code">g1</span>)
that now indicates an existing file. <span class="code">cp</span> removes that
existing file and then creates a new copy with that name. The third
<span class="code">cp</span>, however, names an existing file that happens to be a
directory. In this case, <span class="code">cp</span> does not replace
<span class="code">g1</span> but writes a copy (named <span class="code">math.h</span>)
inside the directory <span class="code">g1</span>.
</p></div>
</p>

</li><li>Text: some commands receive text as an argument. The simplest example is <span class="code">echo</span>, which simply prints its arguments:

<div class="informalexample"><div class="title_example">Try This:</div><div class="programlisting">echo Hello world
echo I am $user
</div></div>


<p class="para">A more interesting example is the <span class="code">grep</span> command, which
searches files for lines containing desired text. For example,
<div class="informalexample"><div class="title_example">Try This:</div><p class="para">
<div class="programlisting">more /usr/include/math.h
grep cos /usr/include/math.h
</div>
The <span class="code">grep</span> command lists all lines inside <span class="filename">/usr/include/math.h</span> containing
the string <span class="quote">
      &#8220;cos&#8221;
    </span>. We'll shortly see ways to write more complex search patterns.
</p></div>
</p>


</li><li>
<p class="para">
Flags: these are special arguments used to alter or control the behavior of
a command. Flags for Unix commands are usually written beginning with
a <span class="quote">
      &#8220;-&#8221;
    </span> or occasionally <span class="quote">
      &#8220;--&#8221;
    </span>. 
<div class="informalexample"><div class="title_example">Try This:</div><p class="para">
<div class="programlisting">ls ~
ls -a ~
ls /usr/include
ls -l /usr/include
</div>
to see the difference in behavior caused by the <span class="code">-l</span> flag.
</p></div>
</p>
<p class="para">
How do you know what kind of arguments can be accepted by each
command? You pretty much have to deal with this on a individual
basis, though for any specific command you can consult the on-line
manual for that command via <span class="code">man</span>, e.g.
<div class="programlisting">
man ls
man grep
</div>
</p>
</li></ol></div>
</p>
  <div name="fn_fnote10" id="fn_fnote10" class="footnote">10. In fact, there are an infinite
number of relative paths for most files, though most are pretty silly,
e.g., <span class="code">../playing/../playing/./././math.h</span>. (<a href="#fn_fref10">back</a>)
    </div></div><div class="sect3" id="specialChar"><div class="info_sect3"><div class="title_sect4">2.2.2. Special Characters</div></div>
    
    <p class="para">As you type, some characters have a special meaning. For example, if
you have entered the first few letters of a file name and hit the 
<span class="quote">
      &#8220;Tab&#8221;
    </span> key, the shell will examine what you have typed so far and
attempt to complete the filename by filling in the remaining
characters. If the shell is unable to complete the filename, a bell or
beep sound will be given. Even in this case, the shell will fill in as
many characters as it can.</p>
    <p class="para">Most special characters are entered by holding down the <span class="quote">
      &#8220;Control&#8221;
    </span>
key while typing a letter. By convention, we designate this by placing
the symbol <span class="quote">
      &#8220;^&#8221;
    </span> in front of the name of the second key. For
example, if you have typed zero or more letters of a filename and want
to see a list of what filenames begin with what you have typed, you
could type ^D, i.e., hold down the <span class="quote">
      &#8220;Control&#8221;
    </span> key and type
<span class="quote">
      &#8220;d&#8221;
    </span>.</p>
    <p class="para">Some other useful special keys are:
<div class="itemizedlist"><ul><li>^C is used to abort a program/command that is running too
long or working incorrectly. Beware: aborting a program that is
updating a file may leave garbage in that file.</li><li>^D is used when a command/program is reading many lines of
input from the keyboard and you want to signal the end of the input.</li><li>^H, the <span class="quote">
      &#8220;Backspace&#8221;
    </span> key, and the <span class="quote">
      &#8220;Delete&#8221;
    </span> key all
delete the most recently typed character.</li><li>^B moves the cursor <span class="emphasis-bold" role="bold">B</span>ackwards over what you have
just typed, without deleting those characters. This is useful in 
correcting typing mistakes.
The <span class="quote">
      &#8220;left&#8221;
    </span> arrow on your keyboard may also do the same thing.</li><li>^F moves the cursor <span class="emphasis-bold" role="bold">F</span>orwards over what you have
just typed, without deleting those characters. 
The <span class="quote">
      &#8220;right&#8221;
    </span> arrow on your keyboard may also do the same thing.</li><li>^P retrieves the <span class="emphasis-bold" role="bold">P</span>revious command that you had typed
in. Repeated ^P's may be used to look back through a number of
commands that you have issued recently.

<p class="para">The <span class="quote">
      &#8220;up&#8221;
    </span> arrow on your keyboard may also do the same thing.</p></li><li>^N is the opposite of ^P. After one or more ^
P's, a ^N allows you to move back to the <span class="emphasis-bold" role="bold">N</span>ext more recent
command.

<p class="para">The <span class="quote">
      &#8220;down&#8221;
    </span> arrow on your keyboard may also do the same thing.</p></li><li>In many programs, ^Z pauses the program and returns you
temporarily to the shell. To return to the paused program, give the
command: <span class="code">fg</span></li></ul></div></p>
  </div><div class="sect3" id="cmdpatterns"><div class="info_sect3"><div class="title_sect4">2.2.3. One Pattern, Many Instances</div></div><div class="TOC">Contents:<div class="TOC-section3"><a href="#wildcards">2.2.3.1 Wild Cards</a></div><div class="TOC-section3"><a href="#regexp">2.2.3.2 Regular Expressions</a></div><div class="TOC-section4"><a href="#grepregexps">2.2.3.2.1 Regular Expressions and <span class="code">grep</span></a></div><div class="TOC-section4"><a href="#sedregexps">2.2.3.2.2 Regular Expressions and <span class="code">sed</span></a></div></div>
    
    <p class="para">
In the command examples we have used so far, we have always written a
single file path or a single text string. In many cases, however, we
want to supply commands with a whole list of files or text
strings. Typing out the whole list, one at a time, would be tedious,<a onmouseover="DBshowBriefly('fn_fref11_live')" name="fn_fref11" id="fn_fref11" class="footnotemark" href="#fn_fnote11">11</a><div class="footnote_live" id="fn_fref11_live"><p class="para">Don't forget, though, that you can use the <a url="#specialChar" href="#specialChar">tab</a> character to speed up typing of individual file names.</p></div>
so we usually write some kind of pattern that describes multiple items
instead.
</p>
    <div class="sect4" id="wildcards"><div class="info_sect4"><div class="title_sect5">2.2.3.1. Wild Cards</div></div>
      

<p class="para">Whenever we have a command that can take multiple filenames, we can often write a single pattern for several files. Patterns for file names use <span class="firstterm">wildcard</span> characters, the most common of which is <span class="quote">
      &#8220;*&#8221;
    </span>, which tells the shell<a onmouseover="DBshowBriefly('fn_fref12_live')" name="fn_fref12" id="fn_fref12" class="footnotemark" href="#fn_fnote12">12</a><div class="footnote_live" id="fn_fref12_live"><p class="para">The program that reads your keyboard input, determines what command or program you want to run, then launches that program.</p></div> to substitute any combination of zero or
more characters that results in an existing filename.
</p>
      <p class="para">
<div class="informalexample"><div class="title_example">Try This:</div><p class="para">
<div class="programlisting">  ls ~/playing
  rm ~/playing/*
  ls ~/playing
</div>
What files were matched by the wildcard pattern in the <span class="code">rm</span> command?
</p><p class="para">
<div class="programlisting">  ls /usr/include
</div>
             Notice that there are a number
                                of files ending with .h
<div class="programlisting">  cp /usr/include/s*.h ~/playing
  ls ~/playing
</div>
Again, note the use of the wildcard to form a pattern for multiple file names.
  In cases, like this, where
there are multiple possibile matched, the shell forms a
list of all the matches. So the <span class="code">rm</span> command actually saw a
list of all the files in the <span class="code">~/playing</span> directory, and the
<span class="code">cp</span> command saw all the files in the 
in the <span class="code">/usr/include</span> directory whose
names began with <span class="quote">
      &#8220;s&#8221;
    </span> and
ended with <span class="quote">
      &#8220;.h&#8221;
    </span>.</p></div>
      </p>

      <p class="para">One good way to figure out what files will match a wildcard pattern is to use the <span class="code">echo</span> command. <span class="code">echo</span> simply prints out its arguments. But since the arguments in the command line  are  processed by the shell <span class="emphasis">before</span> invoking the <span class="code">echo</span> program, any wildcard patterns will have already been expanded.
<div class="informalexample"><div class="title_example">Try This:</div><p class="para">

<div class="programlisting">   ls /usr/include
   echo /usr/include
   echo /usr/include/*.*
   echo /usr/include/*
</div>
The difference between the last two may be subtle. The <span class="quite">*.*</span> pattern will match only files that contain a <span class="quote">
      &#8220;.&#8221;
    </span>. Unlike Windows, Unix does not require file names to end with a period and a three-letter extension. Some sort of period and extension is common, but directory names and executable programs often have no extension and no period. (In Windows, you can create a file with an empty extension, but Windows insists on adding a period at the end.)
<div class="programlisting">
   echo /usr/include/f*.*
   echo /usr/include/*f*.*
</div>
</p></div>
</p>
    <div name="fn_fnote12" id="fn_fnote12" class="footnote">12. <p class="para">The program that reads your keyboard input, determines what command or program you want to run, then launches that program.</p> (<a href="#fn_fref12">back</a>)
    </div></div>
    <div class="sect4" id="regexp"><div class="info_sect4"><div class="title_sect5">2.2.3.2. Regular Expressions</div></div><div class="TOC">Contents:<div class="TOC-section4"><a href="#grepregexps">2.2.3.2.1 Regular Expressions and <span class="code">grep</span></a></div><div class="TOC-section4"><a href="#sedregexps">2.2.3.2.2 Regular Expressions and <span class="code">sed</span></a></div></div>
      
      <p class="para">
If wildcards provide a way to write patterns for file and directory
paths, can we also write patterns for text strings? Yes, but this is
not built into the shell for use by every command, the way that
wildcards are. Instead, most Unix programs and commands that do some
kind of searching or matching for text will
share a common notation for patterns of text to be matched. This
notation is called <span class="firstterm">regular expressions</span>. For example, almost
every text editor in any operating system will allow you to search a
file for a given string. But most Unix text editors (including the
<span class="code">emacs</span> editor we'll study <a href="../emacs/">later</a>) will allow you to
search for any string matching a regular expression
<span class="quote">
      &#8220;pattern&#8221;
    </span>. <span class="code">sed</span>, a useful utility for doing
simple changes to text files, is most often invoked to use its
<span class="quote">
      &#8220;substitute&#8221;
    </span> command, which replaces any text matching a
regular expression by some desired replacement text. The
<span class="code">csplit</span> command splits a single file into multiple pieces, where
the point of division is most often indicated via a regular
expression.  <span class="code">Perl</span> and <span class="code">awk</span>, available on most
Unix systems but not covered in this course, are scripting
(programming) languages with a heavy emphasis on text manipulation,
which is accomplished largely through matching on regular expressions.
</p>

<div class="sect5" id="grepregexps"><div class="info_sect5"><div class="title_sect6">Regular Expressions and <span class="code">grep</span></div></div>
  
      <p class="para">
In an earlier example, we saw that the program <span class="code">grep</span> can
be used to list all lines of a file that match a given string. For
example,
<div class="programlisting">  grep 'cos' /usr/include/math.h
</div>
would list all lines in the indicated file that contain the string
<span class="quote">
      &#8220;cos&#8221;
    </span>. 
</p>
      <p class="para">
expression. The above example works because of the way that regular
expressions are composed. The first rules of regular expressions are:

<div class="itemizedlist"><ul><li>
    <p class="para">
      <span class="emphasis-italic" role="italic">A regular expression consisting of a single
      <span class="quote">
      &#8220;non-special&#8221;
    </span> character will match any string
      containing that character.</span>
    </p>
    <p class="para">
      As it happens, none of the alphabetic and numeric characters
      are <span class="quote">
      &#8220;special&#8221;
    </span>, so the regular
      expression <span class="code">c</span>
      would match any string containing a <span class="quote">
      &#8220;c&#8221;
    </span>. 
      <div class="informalexample"><div class="title_example">Try This:</div><p class="para">
	  <div class="programlisting">grep c /usr/include/math.h
</div>

          Since <span class="code">grep</span> works line by line, this 
	  would select every line containing a <span class="quote">
      &#8220;c&#8221;
    </span>.
	</p></div>
    </p>
  </li><li>
    <span class="emphasis-italic" role="italic">If a set of regular expressions
      <span class="inlineequation"><span class="mathphrase">r<sub>1</sub></span></span>,
      <span class="inlineequation"><span class="mathphrase">r<sub>2</sub></span></span>, &#8230;,
      <span class="inlineequation"><span class="mathphrase">r<sub>k</sub></span></span> are concatenated together to
      form a single larger regular expression
      <span class="inlineequation"><span class="mathphrase">r<sub>1</sub>r<sub>2</sub>&#8230;r<sub>k</sub></span></span>,
      it matches any string that contains a substring formed from a
      concatenation of strings  
      <span class="inlineequation"><span class="mathphrase">s<sub>1</sub>s<sub>2</sub>&#8230;s<sub>k</sub></span></span>,
       each of which matches the corresponding regular expression.</span><p class="para">So when we write
<div class="programlisting">  grep cos /usr/include/math.h
</div>
         the <span class="code">cos</span> is actually the concatenation of three
         regular expressions <span class="code">c</span>, <span class="code">o</span>, and
         <span class="code">s</span>, and matches any string that contains a
         substring matching <span class="code">c</span> followed immediately by a
         substring <span class="code">o</span> followed immediately by a substring 
         matching <span class="code">s</span>.
      </p><p class="para">That may seem an unnecessarily complex way to get to the
      original idea of <span class="quote">
      &#8220;matches the string `cos',&#8221;
    </span> but
      this idea of concatenation is a general one that becomes more
      important as we consider other combinations of 
      smaller regular expressions.
      </p>
</li></ul></div>
The real power of regular expressions comes into play when we consider
the various <span class="quote">
      &#8220;special&#8221;
    </span> characters that serve as regular
expression operators.
<div class="itemizedlist"><ul><li>
    <span class="emphasis-italic" role="italic">Regular expressions can be grouped in
    parentheses, written as
    <span class="code">(</span>&#8230;<span class="code">)</span>.</span><p class="para">So these two
    commands do exactly the same  thing:<a onmouseover="DBshowBriefly('fn_fref13_live')" name="fn_fref13" id="fn_fref13" class="footnotemark" href="#fn_fnote13">13</a><div class="footnote_live" id="fn_fref13_live"><p class="para"><span class="code">egrep</span>
    is an <span class="quote">
      &#8220;extended&#8221;
    </span><span class="code">grep</span> that supports a
    richer set of regular expression operations than does regular
    <span class="code">grep</span>.</p></div>
    <div class="programlisting">  egrep 'cos' /usr/include/math.h
  egrep '(cos)' /usr/include/math.h
</div>
    </p>
    <div class="informalexample"><div class="title_example">Try This:</div><div class="programlisting">grep '(' /usr/include/math.h
egrep '(' /usr/include/math.h
egrep '\(' /usr/include/math.h
</div><p class="para">
      <span class="quote">
      &#8220;(&#8221;
    </span> is special to <span class="code">egrep</span>, but not to
      <span class="code">grep</span>. To take away the <span class="quote">
      &#8220;special-ness&#8221;
    </span>, we
      can quote the parenthesis character when presenting it to
      <span class="code">egrep</span>. 
    </p></div>
  </li><li>
    <p class="para">
      <span class="emphasis-italic" role="italic"><span class="code">[</span>&#8230;<span class="code">]</span>
      brackets containing any set of characters not beginning with ^
      will match a string containing any one of those
      characters.</span>
    </p>
    <p class="para">
      <div class="informalexample"><div class="title_example">Try This:</div><div class="programlisting">  grep sqrt /usr/include/math.h
  grep '[sS][qQ][rR][tT]' /usr/include/math.h
</div><p class="para">
	  The regular expression <span class="code">[sS]</span> matches any single
	  character that is either <span class="quote">
      &#8220;s&#8221;
    </span> or
	  <span class="quote">
      &#8220;S&#8221;
    </span>, and so on.<a onmouseover="DBshowBriefly('fn_fref14_live')" name="fn_fref14" id="fn_fref14" class="footnotemark" href="#fn_fnote14">14</a><div class="footnote_live" id="fn_fref14_live"><p class="para">Actually, doing
	  case-insensitive matches is so common that <span class="code">grep</span>
	  provides a shortcut. The <span class="code">-i</span> flag makes all
	  character matches case insensitive, so
	  <div class="programlisting">  grep -i 'sqrt' /usr/include/math.h
  grep '[sS][qQ][rR][tT]' /usr/include/math.h
</div>
           are identical.</p></div>
	</p></div>
    </p>
    <p class="para">
      <div class="informalexample"><div class="title_example">Try This:</div><p class="para">
	  Compare the output from
<div class="programlisting">  grep '(' /usr/include/math.h
  grep ' (' /usr/include/math.h
  grep '[ (]' /usr/include/math.h
  grep '((' /usr/include/math.h
  grep '[ (](' /usr/include/math.h
</div>
	</p></div>
    </p>
    <p class="para">
      The character set inside a regular expression square brackets can
      be abbreviated by giving a range of characters separated by a
      hyphen. For example, <span class="code">[a-z]</span> would match all the
      lower-case alphabetic characters.
      <div class="informalexample"><div class="title_example">Try This:</div><p class="para">
	    What lines are <span class="emphasis">not</span> listed by the following?
<div class="programlisting">
  grep '_[a-zA-Z]' /usr/include/math.h
</div>
If you can't figure it out, you can check with the command
<div class="programlisting">
  grep -v '_[a-zA-Z]' /usr/include/math.h
</div>
The <span class="code">-v</span> option causes <span class="code">grep</span> to list only those lines that do <span class="emphasis">not</span> match the pattern.
	</p></div>
    </p>
  </li><li>
    <p class="para">
      <span class="emphasis-italic" role="italic"><span class="code">[</span>&#8230;<span class="code">]</span>
      brackets containing any set of characters beginning with ^ will
      match a string containing any character <span class="emphasis">not</span>
      in that set.</span>
    </p>
    <p class="para">
      <div class="informalexample"><div class="title_example">Try This:</div><div class="programlisting">  grep 'cos' /usr/include/math.h
  grep '[^a]cos' /usr/include/math.h
</div></div>
    </p>
  </li><li>
    <p class="para">
      <span class="emphasis-italic" role="italic"><span class="code">.</span> matches any single 
      printable character, including blanks, but not including the
      end-of-line character.</span>
    </p>

    <p class="para">
      <div class="informalexample"><div class="title_example">Try This:</div><div class="programlisting">  grep 'd.f' /usr/include/math.h
</div></div>
    </p>
  </li><li>
    <p class="para">
      <span class="emphasis-italic" role="italic">
	If <span class="inlineequation"><span class="mathphrase">r</span></span>
	is a regular expression, then
	<span class="code"><span class="inlineequation"><span class="mathphrase">r</span></span>*</span> 
	matches zero or more successive strings, each of which matches 
	<span class="inlineequation"><span class="mathphrase">r</span></span>.</span>
    </p>
    <p class="para">
      <div class="informalexample"><div class="title_example">Try This:</div><div class="programlisting">  grep 'ER*N' /usr/include/math.h
  grep '#.*if' /usr/include/math.h
</div><p class="para">
	  Note that the behavior of <span class="code">*</span> is very different
	  in regular expressions than it is in file path wildcards.
	</p></div>
    </p>
  </li><li>
    <p class="para">
      <span class="emphasis-italic" role="italic">If
      <span class="inlineequation"><span class="mathphrase">r</span></span> is a
      regular expression, then
      <span class="code"><span class="inlineequation"><span class="mathphrase">r</span></span>+</span>
      matches one or more successive strings, each of which matches
      <span class="inlineequation"><span class="mathphrase">r</span></span>.</span>
    </p>
    <div class="informalexample"><div class="title_example">Try This:</div><p class="para">
	<div class="programlisting">  grep 'ER*_' /usr/include/math.h
  egrep 'ER+_' /usr/include/math.h
</div>
      </p></div>
  </li><li>
    <p class="para">
      <span class="emphasis-italic" role="italic">If
      <span class="inlineequation"><span class="mathphrase">r</span></span> is a
      regular expression, then
      <span class="code"><span class="inlineequation"><span class="mathphrase">r</span></span>?</span>
      matches zero or one strings matching 
      <span class="inlineequation"><span class="mathphrase">r</span></span>.</span>

	<div class="informalexample"><div class="title_example">Try This:</div><div class="programlisting">  egrep 'def' /usr/include/math.h
  egrep 'define' /usr/include/math.h
  egrep 'def(ine)?' /usr/include/math.h
  egrep 'def(ine)?d' /usr/include/math.h
</div><p class="para">
	     In essence, the <span class="code">?</span> makes the preceding item
	     optional. (So the first and third commands in this
	     example are actually equivalent.)
	   </p></div>
      </p>
    </li><li>
      <p class="para">
	<span class="emphasis-italic" role="italic">
	  If
	  <span class="inlineequation"><span class="mathphrase">r</span></span>
	  is a regular expression, then
	  <span class="code">^<span class="inlineequation"><span class="mathphrase">r</span></span></span>
	  matches any string that begins with a substring matching
	  <span class="inlineequation"><span class="mathphrase">r</span></span>.
	</span>
      </p>

      <div class="informalexample"><div class="title_example">Try This:</div><div class="programlisting">  grep 'ex' /usr/include/math.h
  grep '^ex' /usr/include/math.h
</div></div>
    </li><li>
      <p class="para">
	<span class="emphasis-italic" role="italic">
	  If <span class="inlineequation"><span class="mathphrase">r</span></span>
	  is a regular expression, then
	  <span class="code"><span class="inlineequation"><span class="mathphrase">r</span></span>$</span>
	  matches any string that ends with a substring matching
	  <span class="inlineequation"><span class="mathphrase">r</span></span>.
	</span>
      </p>

      <div class="informalexample"><div class="title_example">Try This:</div><div class="programlisting">  grep '_' /usr/include/math.h
  grep '_$' /usr/include/math.h
</div></div>
    </li></ul></div>
  With so many special characters, you might wonder just what you're
  supposed to do if you really want to search for lines containing a
  <span class="quote">
      &#8220;*&#8221;
    </span>, or a <span class="quote">
      &#8220;?&#8221;
    </span>, or a &#8230; The answer is
  given in our final rule:
  <div class="itemizedlist"><ul><li>
      <p class="para">
	<span class="emphasis-italic" role="italic">
	  If <span class="code">c</span> is a special character, then
	  <span class="code">\c</span> matches that character in a string.
	</span>
      </p>
      <div class="informalexample"><div class="title_example">Try This:</div><div class="programlisting">  grep '3.' /usr/include/math.h
  grep '3\.' /usr/include/math.h
</div></div>
    </li></ul></div>
</p>
      <p class="para">
	This is by no means an exhaustive list of all the regular expression
	operations, but it's probably enough for most purposes. The textbook
	has some additional information, and you can get an exhaustive
	description via the command
	<div class="programlisting">man regexp
</div>
      </p>
    <div name="fn_fnote13" id="fn_fnote13" class="footnote">13. <p class="para"><span class="code">egrep</span>
    is an <span class="quote">
      &#8220;extended&#8221;
    </span><span class="code">grep</span> that supports a
    richer set of regular expression operations than does regular
    <span class="code">grep</span>.</p> (<a href="#fn_fref13">back</a>)
    </div><div name="fn_fnote14" id="fn_fnote14" class="footnote">14. <p class="para">Actually, doing
	  case-insensitive matches is so common that <span class="code">grep</span>
	  provides a shortcut. The <span class="code">-i</span> flag makes all
	  character matches case insensitive, so
	  <div class="programlisting">  grep -i 'sqrt' /usr/include/math.h
  grep '[sS][qQ][rR][tT]' /usr/include/math.h
</div>
           are identical.</p> (<a href="#fn_fref14">back</a>)
    </div></div>

    <div class="sect5" id="sedregexps"><div class="info_sect5"><div class="title_sect6">Regular Expressions and <span class="code">sed</span></div></div>

<p class="para">As noted earlier, many other commands besides <span class="code">grep</span>
will use regular expressions. <span class="code">sed</span>, for example, allows
you to enter a variety of editing commands that will be applied to
every line of a file. A common use of <span class="code">sed</span> is to scan each line of the file for a pattern and to replace that pattern, wherever it occurs, by some string. The <span class="code">sed</span> command to do this is
<div class="programlisting">  sed s/<span class="emphasis" mode="italic">pattern</span>/<span class="emphasis" mode="italic">replacement</span>/g <span class="emphasis" mode="italic">filename</span>
</div>
where <span class="emphasis" mode="italic">filename</span> is the file whose
contents we want to scan and replace, <span class="emphasis" mode="italic">pattern</span> is a regular expression describing
the text to search for in each line, and <span class="emphasis" mode="italic">replacement</span> is the text by which we wish to
replace any thing that matches the pattern.<a onmouseover="DBshowBriefly('fn_fref15_live')" name="fn_fref15" id="fn_fref15" class="footnotemark" href="#fn_fnote15">15</a><div class="footnote_live" id="fn_fref15_live">The '/'
characters are simply necessary to indicate the beginning and end of
the pattern and replacement strings. They can be replaced by any
character that does not appear in either the pattern or replacement
strings.</div>
</p>

<p class="para">
  <div class="informalexample"><div class="title_example">Try This:</div><div class="programlisting">  cd ~/playing
  cp ~cs252/Assignments/ftpAsst/alas.txt .
  more alas.txt
</div><p class="para">
      Now try operating on that file with <span class="code">sed</span>:
    </p><div class="programlisting">  sed s/e/Q/g alas.txt
</div><p class="para">
      for a simple text-to-text substitution, and
    </p><div class="programlisting">
  sed 's/[aeiou]/X/g' alas.txt
</div><p class="para">
      to see that the pattern really is interpreted as a regular expression.<a onmouseover="DBshowBriefly('fn_fref16_live')" name="fn_fref16" id="fn_fref16" class="footnotemark" href="#fn_fnote16">16</a><div class="footnote_live" id="fn_fref16_live"><p class="para">The quotes are required because, as explained in the next section, the '[' and ']' characters are normally considered special characters by the shell, and the quotes tell the shell to leave those characters alone, so that <span class="code">sed</span> can actually see them.</p></div>
    </p></div>
    <p class="para">
      The 'g' at the end of each of the prior examples indicates that
      the change should be applied <span class="emphasis">every</span> time a
      match is found. If the 'g' is dropped, only the first match in
      each line will be replaced.  
    </p>
      <div class="informalexample"><div class="title_example">Try This:</div><div class="programlisting">  sed 's/[aeiou]/X/' alas.txt
</div><p class="para">
	  to see the effect of dropping the 'g'.
	</p></div>
    </p>
  <div name="fn_fnote15" id="fn_fnote15" class="footnote">15. The '/'
characters are simply necessary to indicate the beginning and end of
the pattern and replacement strings. They can be replaced by any
character that does not appear in either the pattern or replacement
strings. (<a href="#fn_fref15">back</a>)
    </div><div name="fn_fnote16" id="fn_fnote16" class="footnote">16. <p class="para">The quotes are required because, as explained in the next section, the '[' and ']' characters are normally considered special characters by the shell, and the quotes tell the shell to leave those characters alone, so that <span class="code">sed</span> can actually see them.</p> (<a href="#fn_fref16">back</a>)
    </div></div>
    </div>
  <div name="fn_fnote11" id="fn_fnote11" class="footnote">11. <p class="para">Don't forget, though, that you can use the <a url="#specialChar" href="#specialChar">tab</a> character to speed up typing of individual file names.</p> (<a href="#fn_fref11">back</a>)
    </div></div><div class="sect3" id="quoting"><div class="info_sect3"><div class="title_sect4">2.2.4. Quoting</div></div>
    
    <p class="para">In the  <span class="code">grep</span> examples of the previous sections, I
took care to enclose each regular expression inside 'quotes'. That's
not some special way to indicate regular expressions, nor is it
specific to text strings as arguments.<a onmouseover="DBshowBriefly('fn_fref17_live')" name="fn_fref17" id="fn_fref17" class="footnotemark" href="#fn_fnote17">17</a><div class="footnote_live" id="fn_fref17_live">Unix is amazingly
tolerant of what characters get put into file names, but only
masochists would use these special characters because the command
shell will interpret them as something else, making it difficult to
type the file name.</div>. Instead, it's a way to be sure
that the command shell did not treat the enclosed characters as
  special shell characters but would pass them, unchanged, to the
<span class="code">grep</span> command. Among the characters that the shell
would tend to treat as <span class="quote">
      &#8220;special&#8221;
    </span> are blanks and
  <span class="a" href=""><span class="emphasis">
            Fix this xref: 
          </span><span class="code">/ * &lt; &gt; | ? \ ; , ! $ ' ` "
</span></span>
We've already seen special uses for the first 3 of these, and will encounter some of the others in later lessons.
</p>
    <p class="para">
  What do we do if we need to type one of these special characters into a command but not have it treated specially? For example, suppose that we had a file <span class="code">foo.txt</span> and we wished to list all the lines in that file that contained a <span class="quote">
      &#8220;&lt;&#8221;
    </span>. We can't do
<div class="screen"><span class="userinput">
  grep &lt; foo.txt
</span></div> 
because the <span class="code">&lt;</span> is a special (input redirection) 
character to the shell.</p>
    <p class="para">What we need to do is to <span class="firstterm">quote</span> that special character somehow to prevent the command shell from treating it specially. There are three ways we can do this:
<div class="orderedlist"><ol><li> We can place a backslash (\) in front of the special character.:
<div class="screen"><span class="userinput">
  grep \&lt; foo.txt
</span></div> 
Note that backslashes can quote themselves. So if we wanted to print on our terminal screen a backslash followed by an asterisk, we could write
<div class="screen"><span class="userinput">
  echo \\\*
</span></div> 
The first backslash quotes the second one. The third one quotes the asterisk.
  </li><li>We can enclose all or part of the argument in single quotation marks. 
      This suppresses all special characters. Also, if the enclosed portion includes blanks, it combines what would otherwise have been seen as multiple parameters into a single parameter.
<div class="screen"><span class="userinput">
  grep Hello there foo.txt
</span></div> 
This would look in the files named <span class="quote">
      &#8220;there&#8221;
    </span> and <span class="quote">
      &#8220;foo.txt&#8221;
    </span> for any lines containing the word <span class="quote">
      &#8220;Hello&#8221;
    </span>.
<p class="para"><div class="screen"><span class="userinput">
  grep 'Hello there' foo.txt
</span></div> 
This would look in the file named <span class="quote">
      &#8220;foo.txt&#8221;
    </span> for any lines containing the phrase <span class="quote">
      &#8220;Hello there&#8221;
    </span>.
</p>
<p class="para"><div class="screen"><span class="userinput">
  grep 'Hello there!' foo.txt
</span></div> 
This would look in the file named <span class="quote">
      &#8220;foo.txt&#8221;
    </span> for any lines containing the phrase <span class="quote">
      &#8220;Hello there!&#8221;
    </span>. Note that, without the quotes, the <span class="quote">
      &#8220;!&#8221;
    </span> would have been treated as a special character.
</p>
</li><li>
<p class="para">
  Finally, we can enclose all or part of the argument in double quotation marks. 
  This suppresses all special characters except $, and also gathers
  its contents into a single parameter.
</p>
  <div class="informalexample"><div class="title_example">Try This:</div><div class="screen"><span class="userinput">
  echo $user *
  echo '$user *'
  echo "$user *"
</span></div><p class="para">
  Can you see the differences in how the two special characters are treated 
in each case? 
</p></div>
</li></ol></div>
</p>
  <div name="fn_fnote17" id="fn_fnote17" class="footnote">17. Unix is amazingly
tolerant of what characters get put into file names, but only
masochists would use these special characters because the command
shell will interpret them as something else, making it difficult to
type the file name. (<a href="#fn_fref17">back</a>)
    </div></div><div name="fn_fnote9" id="fn_fnote9" class="footnote">9. You can see your path by giving the command
<div class="programlisting">
echo $PATH
</div>
And you can <a href="../custom/">modify your <span class="code">$PATH</span></a>, if desired, to add additional directories.
 (<a href="#fn_fref9">back</a>)
    </div></div><script type="text/javascript">
checkForAnchorOnOtherPage('section-2.3','section-2.3');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref18','section-2.3');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref18_live','section-2.3');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('redirect','section-2.3');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('piping','section-2.3');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('xargs','section-2.3');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('find','section-2.3');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fnote18','section-2.3');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('section-2.4','section-2.4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('section-2.4.1','section-2.4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref19','section-2.4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref19_live','section-2.4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fnote19','section-2.4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('section-2.4.2','section-2.4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref20','section-2.4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref20_live','section-2.4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fnote20','section-2.4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('umask','section-2.4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('section-2.4.4','section-2.4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('section-3','section-3');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('vim','section-3');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref21','section-3');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref21_live','section-3');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('section-3.1','section-3.1');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('section-3.2','section-3.2');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('section-3.3','section-3.3');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('markregion','markregion');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref22','markregion');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref22_live','markregion');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fnote22','markregion');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('section-3.5','section-3.5');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('section-3.6','section-3.6');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fnote21','section-3.6');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('section-4','section-4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('section-4.1','section-4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('section-4.1.1','section-4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('twin','section-4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('icewin','section-4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('starwin','section-4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('connections','section-4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('runningx','section-4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref23','section-4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref23_live','section-4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('launchTheServer','section-4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('creatingsession','section-4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('section-4.1.2.1.2','section-4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('section-4.1.2.1.3','section-4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref24','section-4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref24_live','section-4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fnote24','section-4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('section-4.1.2.1.4','section-4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref25','section-4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref25_live','section-4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fnote25','section-4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('launchClient','section-4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref26','section-4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref26_live','section-4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('launchViaSsh','section-4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref27','section-4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref27_live','section-4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fnote27','section-4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('launchViaPutty','section-4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref28','section-4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref28_live','section-4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fnote28','section-4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('xlaunch-sessions','section-4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('xwin32-sessions','section-4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref29','section-4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref29_live','section-4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fnote29','section-4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fnote26','section-4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fnote23','section-4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('section-4.1.3','section-4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('xappl','section-4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('xtrouble','section-4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('cannotOpen','section-4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('firewall','section-4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref30','section-4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref30_live','section-4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref31','section-4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref31_live','section-4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref32','section-4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref32_live','section-4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fnote30','section-4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fnote31','section-4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fnote32','section-4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('xforwarding','section-4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('xfast','section-4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('section-4.1.5.4.1','section-4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('section-4.1.5.4.2','section-4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('xtermFont','section-4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('connect-localhost','section-4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('refusedByServer','section-4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('alternatives','section-4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('RDP','section-4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('vnc','section-4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('vncx','section-4');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('section-4.2','section-4.2');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('emacsinx','section-4.2');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('emacsintelnet','section-4.2');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('section-5','section-5');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('section-5.1','section-5');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('section-5.1.1','section-5');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('section-5.1.2','section-5');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('mailcommand','section-5');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('mailsend','section-5');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('section-5.1.3.2','section-5');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref33','section-5');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref33_live','section-5');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fnote33','section-5');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('popmail','section-5');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('section-5.2','section-5.2');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('pinemain','section-5.2');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('pinecompose','section-5.2');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('pineindex','section-5.2');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('section-6','section-6');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('xfermode','xfermode');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('xfersamba','xfersamba');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref34','xfersamba');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref34_live','xfersamba');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fnote34','xfersamba');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('internetftp','internetftp');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('anonprivateftp','internetftp');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref35','internetftp');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref35_live','internetftp');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fnote35','internetftp');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('ftpclient','internetftp');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref36','internetftp');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref36_live','internetftp');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref37','internetftp');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref37_live','internetftp');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fnote36','internetftp');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fnote37','internetftp');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('xferproblems','xferproblems');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('dostounix','xferproblems');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('unixtodos','xferproblems');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('section-7','section-7');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('section-7.1','section-7');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('section-7.1.1','section-7');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('compshell','section-7');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref38','section-7');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref38_live','section-7');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('cStructure','section-7');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref39','section-7');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref39_live','section-7');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fig:compilation','section-7');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('section-7.1.1.1.1.1','section-7');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('section-7.1.1.1.1.2','section-7');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fnote39','section-7');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('compilingSingle','section-7');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('compilingMultiple','section-7');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('compilerOptions','section-7');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref40','section-7');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref40_live','section-7');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref41','section-7');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref41_live','section-7');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fnote40','section-7');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fnote41','section-7');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fnote38','section-7');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('errmsgs','section-7');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('capturing','section-7');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref42','section-7');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref42_live','section-7');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fnote42','section-7');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('understanding','section-7');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('javacomp','section-7');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref43','section-7');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref43_live','section-7');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('jproject','section-7');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fnote43','section-7');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('section-7.1.1.4','section-7');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('emacserr','section-7');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('emacs-next-error','section-7');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref44','section-7');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref44_live','section-7');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fnote44','section-7');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('vimcompile','section-7');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('vimscreen','section-7');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('section-7.1.2','section-7');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref45','section-7');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref45_live','section-7');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('section-7.1.2.1','section-7');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('section-7.1.2.2','section-7');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('artificial-targets','section-7');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('writingMakefiles','section-7');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('section-7.1.2.5','section-7');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fnote45','section-7');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('section-7.1.3','section-7');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('section-7.1.3.1','section-7');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref46','section-7');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref46_live','section-7');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref47','section-7');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref47_live','section-7');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fnote46','section-7');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fnote47','section-7');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('section-7.1.3.2','section-7');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('section-7.1.3.3','section-7');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('gdbmode','section-7');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref48','section-7');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref48_live','section-7');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref49','section-7');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref49_live','section-7');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fnote48','section-7');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fnote49','section-7');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('section-7.2','section-7.2');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('section-7.2.1','section-7.2');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('section-7.2.2','section-7.2');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('gdbxfig','section-7.2');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('dddfig','section-7.2');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('section-8','section-8');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('section-8.1','section-8');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref50','section-8');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref50_live','section-8');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('loginCustom','section-8');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref51','section-8');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref51_live','section-8');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref52','section-8');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref52_live','section-8');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fnote51','section-8');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fnote52','section-8');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('xCustom','section-8');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('programCustom','section-8');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fnote50','section-8');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('section-8.2','section-8.2');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('section-8.2.1','section-8.2');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('controlflow','section-8.2');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref53','section-8.2');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fref53_live','section-8.2');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('fn_fnote53','section-8.2');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('section-8.2.3','section-8.2');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('section-8.2.4','section-8.2');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('section-8.2.4.1','section-8.2');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('section-8.2.4.2','section-8.2');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('scriptDebugging','section-8.2');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('section-8.2.5.1','section-8.2');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('section-8.2.5.2','section-8.2');
</script><script type="text/javascript">
checkForAnchorOnOtherPage('tracing','section-8.2');
</script><br/><table width="100%" class="navigationBar"><tr class="navigationBar"><td width="5%" class="navigationBar"><a class="navigationBarArrow" title="First" href="http://cocoon.cs.odu.edu:80/cocoon/~cs252/open/unix/unix.html"><img class="navigationBar" src="_axle/first.gif" alt="First"/></a></td><td width="5%" class="navigationBar"><a class="navigationBarArrow" title="Prev" href="http://cocoon.cs.odu.edu:80/cocoon/~cs252/open/unix/section-2.html"><img class="navigationBar" src="_axle/prev.gif" alt="Prev"/></a></td><td width="5%" class="navigationBar"><a class="navigationBarArrow" title="Up" href="http://cocoon.cs.odu.edu:80/cocoon/~cs252/open/unix/section-2.html"><img class="navigationBar" src="_axle/up.gif" alt="Up"/></a></td><td width="5%" class="navigationBar"><a class="navigationBarArrow" title="Next" href="http://cocoon.cs.odu.edu:80/cocoon/~cs252/open/unix/section-2.3.html"><img class="navigationBar" src="_axle/next.gif" alt="Next"/></a></td><td width="5%" class="navigationBar"><a class="navigationBarArrow" title="Last" href="http://cocoon.cs.odu.edu:80/cocoon/~cs252/open/unix/section-8.2.html"><img class="navigationBar" src="_axle/last.gif" alt="Last"/></a></td><td class="navigationBar"/><td width="5%" class="navigationBar"><a class="navigationBar" title="CS252 Home" href="http://cocoon.cs.odu.edu:80/cocoon/~cs252/directory/announcements.html"><img class="navigationBar" src="_axle/home.gif" alt="CS252 Home"/></a></td><td width="5%" class="navigationBar"><a class="navigationBar" title="discuss this page" href="http://cocoon.cs.odu.edu:80/cocoon/~cs252/forum/getXPath/open/unix/section-2.2.html"><img class="navigationBar" src="_axle/forum.gif" alt="discuss this page"/></a></td></tr></table></body></html>