036409b859
OpenBSD tree. No objections on netbsd-docs.
1223 lines
26 KiB
Plaintext
1223 lines
26 KiB
Plaintext
.\" $NetBSD: u2,v 1.1 2007/11/29 12:35:06 mjf Exp $
|
|
.\"
|
|
.\" Copyright (C) Caldera International Inc. 2001-2002.
|
|
.\" All rights reserved.
|
|
.\"
|
|
.\" Redistribution and use in source and binary forms, with or without
|
|
.\" modification, are permitted provided that the following conditions
|
|
.\" are met:
|
|
.\" 1. Redistributions of source code and documentation must retain the above
|
|
.\" copyright notice, this list of conditions and the following disclaimer.
|
|
.\" 2. Redistributions in binary form must reproduce the above copyright
|
|
.\" notice, this list of conditions and the following disclaimer in the
|
|
.\" documentation and/or other materials provided with the distribution.
|
|
.\" 3. All advertising materials mentioning features or use of this software
|
|
.\" must display the following acknowledgement:
|
|
.\" This product includes software developed or owned by Caldera
|
|
.\" International, Inc.
|
|
.\" 4. Neither the name of Caldera International, Inc. nor the names of other
|
|
.\" contributors may be used to endorse or promote products derived from
|
|
.\" this software without specific prior written permission.
|
|
.\"
|
|
.\" USE OF THE SOFTWARE PROVIDED FOR UNDER THIS LICENSE BY CALDERA
|
|
.\" INTERNATIONAL, INC. AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR
|
|
.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
.\" IN NO EVENT SHALL CALDERA INTERNATIONAL, INC. BE LIABLE FOR ANY DIRECT,
|
|
.\" INDIRECT INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
.\" (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
.\" SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|
.\" STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
|
.\" IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
.\" POSSIBILITY OF SUCH DAMAGE.
|
|
.\"
|
|
.\" @(#)u2 8.1 (Berkeley) 6/8/93
|
|
.\"
|
|
.SH
|
|
II. DAY-TO-DAY USE
|
|
.SH
|
|
Creating Files \(em The Editor
|
|
.PP
|
|
If you have to type a paper or a letter or a program,
|
|
how do you get the information stored in the machine?
|
|
Most of these tasks are done with
|
|
the
|
|
.UC UNIX
|
|
``text editor''
|
|
.UL ed .
|
|
Since
|
|
.UL ed
|
|
is thoroughly documented in
|
|
.UL ed (1)
|
|
and explained in
|
|
.ul
|
|
A Tutorial Introduction to the UNIX Text Editor,
|
|
we won't spend any time here describing how to use it.
|
|
All we want it for right now is to make some
|
|
.ul
|
|
files.
|
|
(A file is just a collection of information stored in the machine,
|
|
a simplistic but adequate definition.)
|
|
.PP
|
|
To create a file
|
|
called
|
|
.UL junk
|
|
with some text in it, do the following:
|
|
.P1
|
|
.ta .65i
|
|
ed junk \fR(invokes the text editor)\f3
|
|
a \fR(command to ``ed'', to add text)\f3
|
|
.ft I
|
|
now type in
|
|
whatever text you want ...
|
|
.ft 3
|
|
\&. \fR(signals the end of adding text)\f3
|
|
.P2
|
|
The ``\f3.\fR'' that signals the end of adding text must be
|
|
at the beginning of a line by itself.
|
|
Don't forget it,
|
|
for until it is typed,
|
|
no other
|
|
.UL ed
|
|
commands will be recognized \(em
|
|
everything you type will be treated as text to be added.
|
|
.PP
|
|
At this point you can do various editing operations
|
|
on the text you typed in, such as correcting spelling mistakes,
|
|
rearranging paragraphs and the like.
|
|
Finally, you must write the information you have typed
|
|
into a file with the editor command
|
|
.UL w :
|
|
.P1
|
|
w
|
|
.P2
|
|
.UL ed
|
|
will respond with the number of characters it wrote
|
|
into the file
|
|
.UL junk .
|
|
.PP
|
|
Until the
|
|
.UL w
|
|
command,
|
|
nothing is stored permanently,
|
|
so if you hang up and go home
|
|
the information is lost.\(dg
|
|
.FS
|
|
\(dg This is not strictly true \(em
|
|
if you hang up while editing, the data you were
|
|
working on is saved in a file called
|
|
.UL ed.hup ,
|
|
which you can continue with at your next session.
|
|
.FE
|
|
But after
|
|
.UL w
|
|
the information is there permanently;
|
|
you can re-access it any time by typing
|
|
.P1
|
|
ed junk
|
|
.P2
|
|
Type a
|
|
.UL q
|
|
command
|
|
to quit the editor.
|
|
(If you try to quit without writing,
|
|
.UL ed
|
|
will print a
|
|
.UL ?
|
|
to remind you.
|
|
A second
|
|
.UL q
|
|
gets you out regardless.)
|
|
.PP
|
|
Now create a second file called
|
|
.UL temp
|
|
in the same manner.
|
|
You should now have two files,
|
|
.UL junk
|
|
and
|
|
.UL temp .
|
|
.SH
|
|
What files are out there?
|
|
.PP
|
|
The
|
|
.UL ls
|
|
(for ``list'') command lists the names
|
|
(not contents)
|
|
of any of the files that
|
|
.UC UNIX
|
|
knows about.
|
|
If you type
|
|
.P1
|
|
ls
|
|
.P2
|
|
the response will be
|
|
.P1
|
|
junk
|
|
temp
|
|
.P2
|
|
which are indeed the two files just created.
|
|
The names are sorted into alphabetical order automatically,
|
|
but other variations are possible.
|
|
For example,
|
|
the command
|
|
.P1
|
|
ls -t
|
|
.P2
|
|
causes the files to be listed in the order in which they were last changed,
|
|
most recent first.
|
|
The
|
|
.UL \-l
|
|
option gives a ``long'' listing:
|
|
.P1
|
|
ls -l
|
|
.P2
|
|
will produce something like
|
|
.P1
|
|
-rw-rw-rw- 1 bwk users 41 Jul 22 2:56 junk
|
|
-rw-rw-rw- 1 bwk users 78 Jul 22 2:57 temp
|
|
.P2
|
|
The date and time are of the last change to the file.
|
|
The 41 and 78 are the number of characters
|
|
(which should agree with the numbers you got from
|
|
.UL ed ).
|
|
.UL bwk
|
|
is the owner of the file, that is, the person
|
|
who created it.
|
|
.UL users
|
|
is the name of the file's group.
|
|
The
|
|
.UL \-rw\-rw\-rw\-
|
|
tells who has permission to read and write the file,
|
|
in this case everyone.
|
|
.PP
|
|
Options can be combined:
|
|
.UL ls\ \-lt
|
|
gives the same thing as
|
|
.UL ls\ \-l ,
|
|
but sorted into time order.
|
|
You can also name the files you're interested in,
|
|
and
|
|
.UL ls
|
|
will list the information about them only.
|
|
More details can be found in
|
|
.UL ls (1).
|
|
.PP
|
|
The use of optional arguments that begin with a minus sign,
|
|
like
|
|
.UL \-t
|
|
and
|
|
.UL \-lt ,
|
|
is a common convention for
|
|
.UC UNIX
|
|
programs.
|
|
In general, if a program accepts such optional arguments,
|
|
they precede any filename arguments.
|
|
It is also vital that you separate the various arguments with spaces:
|
|
.UL ls\-l
|
|
is not the same as
|
|
.UL ls\ \ \-l .
|
|
.SH
|
|
Printing Files
|
|
.PP
|
|
Now that you've got a file of text,
|
|
how do you print it so people can look at it?
|
|
There are a host of programs that do that,
|
|
probably more than are needed.
|
|
.PP
|
|
One simple thing is to use the editor,
|
|
since printing is often done just before making changes anyway.
|
|
You can say
|
|
.P1
|
|
ed junk
|
|
1,$p
|
|
.P2
|
|
.UL ed
|
|
will reply with the count of the characters in
|
|
.UL junk
|
|
and then print all the lines in the file.
|
|
After you learn how to use the editor,
|
|
you can be selective about the parts you print.
|
|
.PP
|
|
There are times when it's not feasible to use the editor for printing.
|
|
For example, there is a limit on how big a file
|
|
.UL ed
|
|
can handle
|
|
(several thousand lines).
|
|
Secondly,
|
|
it
|
|
will only print one file at a time,
|
|
and sometimes you want to print several, one after another.
|
|
So here are a couple of alternatives.
|
|
.PP
|
|
First is
|
|
.UL cat ,
|
|
the simplest of all the printing programs.
|
|
.UL cat
|
|
simply prints on the terminal the contents of all the files
|
|
named in a list.
|
|
Thus
|
|
.P1
|
|
cat junk
|
|
.P2
|
|
prints one file, and
|
|
.P1
|
|
cat junk temp
|
|
.P2
|
|
prints two.
|
|
The files are simply concatenated (hence the name
|
|
.UL cat '') ``
|
|
onto the terminal.
|
|
.PP
|
|
.UL pr
|
|
produces formatted printouts of files.
|
|
As with
|
|
.UL cat ,
|
|
.UL pr
|
|
prints all the files named in a list.
|
|
The difference is that it produces
|
|
headings with date, time, page number and file name
|
|
at the top of each page,
|
|
and
|
|
extra lines to skip over the fold in the paper.
|
|
Thus,
|
|
.P1
|
|
pr junk temp
|
|
.P2
|
|
will print
|
|
.UL junk
|
|
neatly,
|
|
then skip to the top of a new page and print
|
|
.UL temp
|
|
neatly.
|
|
.PP
|
|
.UL pr
|
|
can also produce multi-column output:
|
|
.P1
|
|
pr -3 junk
|
|
.P2
|
|
prints
|
|
.UL junk
|
|
in 3-column format.
|
|
You can use any reasonable number in place of ``3''
|
|
and
|
|
.UL pr
|
|
will do its best.
|
|
.UL pr
|
|
has other capabilities as well;
|
|
see
|
|
.UL pr (1).
|
|
.PP
|
|
It should be noted that
|
|
.UL pr
|
|
is
|
|
.ul
|
|
not
|
|
a formatting program in the sense of shuffling lines around
|
|
and justifying margins.
|
|
The true formatters are
|
|
.UL nroff
|
|
and
|
|
.UL troff ,
|
|
which we will get to in the section on document preparation.
|
|
.PP
|
|
There are also programs that print files
|
|
on a high-speed printer.
|
|
Look in your manual under
|
|
.UL lpr .
|
|
.SH
|
|
Shuffling Files About
|
|
.PP
|
|
Now that you have some files in the file system
|
|
and some experience in printing them,
|
|
you can try bigger things.
|
|
For example,
|
|
you can move a file from one place to another
|
|
(which amounts to giving it a new name),
|
|
like this:
|
|
.P1
|
|
mv junk precious
|
|
.P2
|
|
This means that what used to be ``junk'' is now ``precious''.
|
|
If you do an
|
|
.UL ls
|
|
command now,
|
|
you will get
|
|
.P1
|
|
precious
|
|
temp
|
|
.P2
|
|
Beware that if you move a file to another one
|
|
that already exists,
|
|
the already existing contents are lost forever.
|
|
.PP
|
|
If you want
|
|
to make a
|
|
.ul
|
|
copy
|
|
of a file (that is, to have two versions of something),
|
|
you can use the
|
|
.UL cp
|
|
command:
|
|
.P1
|
|
cp precious temp1
|
|
.P2
|
|
makes a duplicate copy of
|
|
.UL precious
|
|
in
|
|
.UL temp1 .
|
|
.PP
|
|
Finally, when you get tired of creating and moving
|
|
files,
|
|
there is a command to remove files from the file system,
|
|
called
|
|
.UL rm .
|
|
.P1
|
|
rm temp temp1
|
|
.P2
|
|
will remove both of the files named.
|
|
.PP
|
|
You will get a warning message if one of the named files wasn't there,
|
|
but otherwise
|
|
.UL rm ,
|
|
like most
|
|
.UC UNIX
|
|
commands,
|
|
does its work silently.
|
|
There is no prompting or chatter,
|
|
and error messages are occasionally curt.
|
|
This terseness is sometimes disconcerting
|
|
to new\%comers,
|
|
but experienced users find it desirable.
|
|
.SH
|
|
What's in a Filename
|
|
.PP
|
|
So far we have used filenames without ever saying what's
|
|
a legal name,
|
|
so it's time for a couple of rules.
|
|
First, filenames are limited to 14 characters,
|
|
which is enough to be descriptive.\(dg
|
|
.FS
|
|
\(dg In 4.2 BSD the limit was extended to 255 characters.
|
|
.FE
|
|
Second, although you can use almost any character
|
|
in a filename,
|
|
common sense says you should stick to ones that are visible,
|
|
and that you should probably avoid characters that might be used
|
|
with other meanings.
|
|
We have already seen, for example,
|
|
that in the
|
|
.UL ls
|
|
command,
|
|
.UL ls\ \-t
|
|
means to list in time order.
|
|
So if you had a file whose name
|
|
was
|
|
.UL \-t ,
|
|
you would have a tough time listing it by name.
|
|
Besides the minus sign, there are other characters which
|
|
have special meaning.
|
|
To avoid pitfalls,
|
|
you would do well to
|
|
use only letters, numbers and the period
|
|
until you're familiar with the situation.
|
|
.PP
|
|
On to some more positive suggestions.
|
|
Suppose you're typing a large document
|
|
like a book.
|
|
Logically this divides into many small pieces,
|
|
like chapters and perhaps sections.
|
|
Physically it must be divided too,
|
|
for
|
|
.UL ed
|
|
will not handle really big files.
|
|
Thus you should type the document as a number of files.
|
|
You might have a separate file for each chapter,
|
|
called
|
|
.P1
|
|
chap1
|
|
chap2
|
|
.ft R
|
|
etc...
|
|
.P2
|
|
Or, if each chapter were broken into several files, you might have
|
|
.P1
|
|
chap1.1
|
|
chap1.2
|
|
chap1.3
|
|
\&...
|
|
chap2.1
|
|
chap2.2
|
|
\&...
|
|
.P2
|
|
You can now tell at a glance where a particular file fits into the whole.
|
|
.PP
|
|
There are advantages to a systematic naming convention which are not obvious
|
|
to the novice
|
|
.UC UNIX
|
|
user.
|
|
What if you wanted to print the whole book?
|
|
You could say
|
|
.P1
|
|
pr chap1.1 chap1.2 chap1.3 ......
|
|
.P2
|
|
but you would get tired pretty fast, and would probably even make mistakes.
|
|
Fortunately, there is a shortcut.
|
|
You can say
|
|
.P1
|
|
pr chap*
|
|
.P2
|
|
The
|
|
.UL *
|
|
means ``anything at all,''
|
|
so this translates into ``print all files
|
|
whose names begin with
|
|
.UL chap '',
|
|
listed in alphabetical order.
|
|
.PP
|
|
This shorthand notation
|
|
is not a property of the
|
|
.UL pr
|
|
command, by the way.
|
|
It is system-wide, a service of the program
|
|
that interprets commands
|
|
(the ``shell,''
|
|
.UL sh (1)).
|
|
Using that fact, you can see how to list the names of the files in the book:
|
|
.P1
|
|
ls chap*
|
|
.P2
|
|
produces
|
|
.P1
|
|
chap1.1
|
|
chap1.2
|
|
chap1.3
|
|
\&...
|
|
.P2
|
|
The
|
|
.UL *
|
|
is not limited to the last position in a filename \(em
|
|
it can be anywhere
|
|
and can occur several times.
|
|
Thus
|
|
.P1
|
|
rm *junk* *temp*
|
|
.P2
|
|
removes all files that contain
|
|
.UL junk
|
|
or
|
|
.UL temp
|
|
as any part of their name.
|
|
As a special case,
|
|
.UL *
|
|
by itself matches every filename,
|
|
so
|
|
.P1
|
|
pr *
|
|
.P2
|
|
prints all your files
|
|
(alphabetical order),
|
|
and
|
|
.P1
|
|
rm *
|
|
.P2
|
|
removes
|
|
.ul
|
|
all files.
|
|
(You had better be
|
|
.IT very
|
|
sure that's what you wanted to say!)
|
|
.PP
|
|
The
|
|
.UL *
|
|
is not
|
|
the only pattern-matching feature available.
|
|
Suppose you want to print only chapters 1 through 4 and 9.
|
|
Then you can say
|
|
.P1
|
|
pr chap[12349]*
|
|
.P2
|
|
The
|
|
.UL [...]
|
|
means to match any of the characters inside the brackets.
|
|
A range of consecutive letters or digits can be abbreviated,
|
|
so you can also do this
|
|
with
|
|
.P1
|
|
pr chap[1-49]*
|
|
.P2
|
|
Letters can also be used within brackets:
|
|
.UL [a\-z]
|
|
matches any character in the range
|
|
.UL a
|
|
through
|
|
.UL z .
|
|
.PP
|
|
The
|
|
.UL ?
|
|
pattern matches any single character,
|
|
so
|
|
.P1
|
|
ls ?
|
|
.P2
|
|
lists all files which have single-character names,
|
|
and
|
|
.P1
|
|
ls -l chap?.1
|
|
.P2
|
|
lists information about the first file of each chapter
|
|
.UL chap1.1 \&, (
|
|
.UL chap2.1 ,
|
|
etc.).
|
|
.PP
|
|
Of these niceties,
|
|
.UL *
|
|
is certainly the most useful,
|
|
and you should get used to it.
|
|
The others are frills, but worth knowing.
|
|
.PP
|
|
If you should ever have to turn off the special meaning
|
|
of
|
|
.UL * ,
|
|
.UL ? ,
|
|
etc.,
|
|
enclose the entire argument in single quotes,
|
|
as in
|
|
.P1
|
|
ls \(fm?\(fm
|
|
.P2
|
|
We'll see some more examples of this shortly.
|
|
.SH
|
|
What's in a Filename, Continued
|
|
.PP
|
|
When you first made that file called
|
|
.UL junk ,
|
|
how did
|
|
the system
|
|
know that there wasn't another
|
|
.UL junk
|
|
somewhere else,
|
|
especially since the person in the next office is also
|
|
reading this tutorial?
|
|
The answer is that generally each user
|
|
has a private
|
|
.IT directory ,
|
|
which contains only the files that belong to him.
|
|
When you log in, you are ``in'' your directory.
|
|
Unless you take special action,
|
|
when you create a new file,
|
|
it is made in the directory that you are currently in;
|
|
this is most often your own directory,
|
|
and thus the file is unrelated to any other file of the same name
|
|
that might exist in someone else's directory.
|
|
.PP
|
|
The set of all files
|
|
is organized into a (usually big) tree,
|
|
with your files located several branches into the tree.
|
|
It is possible for you to ``walk'' around this tree,
|
|
and to find any file in the system, by starting at the root
|
|
of the tree and walking along the proper set of branches.
|
|
Conversely, you can start where you are and walk toward the root.
|
|
.PP
|
|
Let's try the latter first.
|
|
The basic tools is the command
|
|
.UL pwd
|
|
(``print working directory''),
|
|
which prints the name of the directory you are currently in.
|
|
.PP
|
|
Although the details will vary according to the system you are on,
|
|
if you give the
|
|
command
|
|
.UL pwd ,
|
|
it will print something like
|
|
.P1
|
|
/usr/your\(hyname
|
|
.P2
|
|
This says that you are currently in the directory
|
|
.UL your-name ,
|
|
which is in turn in the directory
|
|
.UL /usr ,
|
|
which is in turn in the root directory
|
|
called by convention just
|
|
.UL / .
|
|
(Even if it's not called
|
|
.UL /usr
|
|
on your system,
|
|
you will get something analogous.
|
|
Make the corresponding mental adjustment and read on.)
|
|
.PP
|
|
If you now type
|
|
.P1
|
|
ls /usr/your\(hyname
|
|
.P2
|
|
you should get exactly the same list of file names
|
|
as you get from a plain
|
|
.UL ls :
|
|
with no arguments,
|
|
.UL ls
|
|
lists the contents of the current directory;
|
|
given the name of a directory,
|
|
it lists the contents of that directory.
|
|
.PP
|
|
Next, try
|
|
.P1
|
|
ls /usr
|
|
.P2
|
|
This should print a long series of names,
|
|
among which is your own login name
|
|
.UL your-name .
|
|
On many systems,
|
|
.UL usr
|
|
is a directory that contains the directories
|
|
of all the normal users of the system,
|
|
like you.
|
|
.PP
|
|
The next step is to try
|
|
.P1
|
|
ls /
|
|
.P2
|
|
You should get a response something like this
|
|
(although again the details may be different):
|
|
.P1
|
|
bin
|
|
dev
|
|
etc
|
|
lib
|
|
tmp
|
|
usr
|
|
.P2
|
|
This is a collection of the basic directories of files
|
|
that
|
|
the system
|
|
knows about;
|
|
we are at the root of the tree.
|
|
.PP
|
|
Now try
|
|
.P1
|
|
cat /usr/your\(hyname/junk
|
|
.P2
|
|
(if
|
|
.UL junk
|
|
is still around in your directory).
|
|
The name
|
|
.P1
|
|
/usr/your\(hyname/junk
|
|
.P2
|
|
is called the
|
|
.UL pathname
|
|
of the file that
|
|
you normally think of as ``junk''.
|
|
``Pathname'' has an obvious meaning:
|
|
it represents the full name of the path you have to follow from the root
|
|
through the tree of directories to get to a particular file.
|
|
It is a universal rule in
|
|
the
|
|
.UC UNIX
|
|
system
|
|
that anywhere you can use an ordinary filename,
|
|
you can use a pathname.
|
|
.PP
|
|
Here is a picture which may make this clearer:
|
|
.P1 1
|
|
.ft R
|
|
.if t .vs 9p
|
|
.if t .tr /\(sl
|
|
.if t .tr ||
|
|
.ce 100
|
|
(root)
|
|
/ | \e
|
|
/ | \e
|
|
/ | \e
|
|
bin etc usr dev tmp
|
|
/ | \e / | \e / | \e / | \e / | \e
|
|
/ | \e
|
|
/ | \e
|
|
adam eve mary
|
|
/ / \e \e
|
|
/ \e junk
|
|
junk temp
|
|
.ce 0
|
|
.br
|
|
.tr //
|
|
.P2
|
|
.LP
|
|
Notice that Mary's
|
|
.UL junk
|
|
is unrelated to Eve's.
|
|
.PP
|
|
This isn't too exciting if all the files of interest are in your own
|
|
directory, but if you work with someone else
|
|
or on several projects concurrently,
|
|
it becomes handy indeed.
|
|
For example, your friends can print your book by saying
|
|
.P1
|
|
pr /usr/your\(hyname/chap*
|
|
.P2
|
|
Similarly, you can find out what files your neighbor has
|
|
by saying
|
|
.P1
|
|
ls /usr/neighbor\(hyname
|
|
.P2
|
|
or make your own copy of one of his files by
|
|
.P1
|
|
cp /usr/your\(hyneighbor/his\(hyfile yourfile
|
|
.P2
|
|
.PP
|
|
If your neighbor doesn't want you poking around in his files,
|
|
or vice versa,
|
|
privacy can be arranged.
|
|
Each file and directory has read-write-execute permissions for the owner,
|
|
a group, and everyone else,
|
|
which can be set
|
|
to control access.
|
|
See
|
|
.UL ls (1)
|
|
and
|
|
.UL chmod (1)
|
|
for details.
|
|
As a matter of observed fact,
|
|
most users most of the time find openness of more
|
|
benefit than privacy.
|
|
.PP
|
|
As a final experiment with pathnames, try
|
|
.P1
|
|
ls /bin /usr/bin
|
|
.P2
|
|
Do some of the names look familiar?
|
|
When you run a program, by typing its name after the prompt character,
|
|
the system simply looks for a file of that name.
|
|
It normally looks first in your directory
|
|
(where it typically doesn't find it),
|
|
then in
|
|
.UL /bin
|
|
and finally in
|
|
.UL /usr/bin .
|
|
There is nothing magic about commands like
|
|
.UL cat
|
|
or
|
|
.UL ls ,
|
|
except that they have been collected into a couple of places to be easy to find and administer.
|
|
.PP
|
|
What if you work regularly with someone else on common information
|
|
in his directory?
|
|
You could just log in as your friend each time you want to,
|
|
but you can also say
|
|
``I want to work on his files instead of my own''.
|
|
This is done by changing the directory that you are
|
|
currently in:
|
|
.P1
|
|
cd /usr/your\(hyfriend
|
|
.P2
|
|
(On some systems,
|
|
.UL cd
|
|
is spelled
|
|
.UL chdir .)
|
|
Now when you use a filename in something like
|
|
.UL cat
|
|
or
|
|
.UL pr ,
|
|
it refers to the file in your friend's directory.
|
|
Changing directories doesn't affect any permissions associated
|
|
with a file \(em
|
|
if you couldn't access a file from your own directory,
|
|
changing to another directory won't alter that fact.
|
|
Of course,
|
|
if you forget what directory you're in, type
|
|
.P1
|
|
pwd
|
|
.P2
|
|
to find out.
|
|
.PP
|
|
It is usually convenient to arrange your own files
|
|
so that all the files related to one thing are in a directory separate
|
|
from other projects.
|
|
For example, when you write your book, you might want to keep all the text
|
|
in a directory called
|
|
.UL book .
|
|
So make one with
|
|
.P1
|
|
mkdir book
|
|
.P2
|
|
then go to it with
|
|
.P1
|
|
cd book
|
|
.P2
|
|
then start typing chapters.
|
|
The book is now found in (presumably)
|
|
.P1
|
|
/usr/your\(hyname/book
|
|
.P2
|
|
To remove the directory
|
|
.UL book ,
|
|
type
|
|
.P1
|
|
rm book/*
|
|
rmdir book
|
|
.P2
|
|
The first command removes all files from the directory;
|
|
the second
|
|
removes the empty directory.
|
|
.PP
|
|
You can go up one level in the tree of files
|
|
by saying
|
|
.P1
|
|
cd ..
|
|
.P2
|
|
.UL .. '' ``
|
|
is the name of the parent of whatever directory you are currently in.
|
|
For completeness,
|
|
.UL . '' ``
|
|
is an alternate name
|
|
for the directory you are in.
|
|
.SH
|
|
Using Files instead of the Terminal
|
|
.PP
|
|
Most of the commands we have seen so far produce output
|
|
on the terminal;
|
|
some, like the editor, also take their input from the terminal.
|
|
It is universal in
|
|
.UC UNIX
|
|
systems
|
|
that the terminal can be replaced by a file
|
|
for either or both of input and output.
|
|
As one example,
|
|
.P1
|
|
ls
|
|
.P2
|
|
makes a list of files on your terminal.
|
|
But if you say
|
|
.P1
|
|
ls >filelist
|
|
.P2
|
|
a list of your files will be placed in the file
|
|
.UL filelist
|
|
(which
|
|
will be created if it doesn't already exist,
|
|
or overwritten if it does).
|
|
The symbol
|
|
.UL >
|
|
means ``put the output on the following file,
|
|
rather than on the terminal.''
|
|
Nothing is produced on the terminal.
|
|
As another example, you could combine
|
|
several files into one by capturing the output of
|
|
.UL cat
|
|
in a file:
|
|
.P1
|
|
cat f1 f2 f3 >temp
|
|
.P2
|
|
.PP
|
|
The symbol
|
|
.UL >>
|
|
operates very much like
|
|
.UL >
|
|
does,
|
|
except that it means
|
|
``add to the end of.''
|
|
That is,
|
|
.P1
|
|
cat f1 f2 f3 >>temp
|
|
.P2
|
|
means to concatenate
|
|
.UL f1 ,
|
|
.UL f2
|
|
and
|
|
.UL f3
|
|
to the end of whatever is already in
|
|
.UL temp ,
|
|
instead of overwriting the existing contents.
|
|
As with
|
|
.UL > ,
|
|
if
|
|
.UL temp
|
|
doesn't exist, it will be created for you.
|
|
.PP
|
|
In a similar way, the symbol
|
|
.UL <
|
|
means to take the input
|
|
for a program from the following file,
|
|
instead of from the terminal.
|
|
Thus, you could make up a script of commonly used editing commands
|
|
and put them into a file called
|
|
.UL script .
|
|
Then you can run the script on a file by saying
|
|
.P1
|
|
ed file <script
|
|
.P2
|
|
As another example, you can use
|
|
.UL ed
|
|
to prepare a letter in file
|
|
.UL let ,
|
|
then send it to several people with
|
|
.P1
|
|
mail adam eve mary joe <let
|
|
.P2
|
|
.SH
|
|
Pipes
|
|
.PP
|
|
One of the novel contributions of
|
|
the
|
|
.UC UNIX
|
|
system
|
|
is the idea of a
|
|
.ul
|
|
pipe.
|
|
A pipe is simply a way to connect the output of one program
|
|
to the input of another program,
|
|
so the two run as a sequence of processes \(em
|
|
a pipeline.
|
|
.PP
|
|
For example,
|
|
.P1
|
|
pr f g h
|
|
.P2
|
|
will print the files
|
|
.UL f ,
|
|
.UL g ,
|
|
and
|
|
.UL h ,
|
|
beginning each on a new page.
|
|
Suppose you want
|
|
them run together instead.
|
|
You could say
|
|
.P1
|
|
cat f g h >temp
|
|
pr <temp
|
|
rm temp
|
|
.P2
|
|
but this is more work than necessary.
|
|
Clearly what we want is to take the output of
|
|
.UL cat
|
|
and
|
|
connect it to the input of
|
|
.UL pr .
|
|
So let us use a pipe:
|
|
.P1
|
|
cat f g h | pr
|
|
.P2
|
|
The vertical bar
|
|
.UL |
|
|
means to
|
|
take the output from
|
|
.UL cat ,
|
|
which would normally have gone to the terminal,
|
|
and put it into
|
|
.UL pr
|
|
to be neatly formatted.
|
|
.PP
|
|
There are many other examples of pipes.
|
|
For example,
|
|
.P1
|
|
ls | pr -3
|
|
.P2
|
|
prints a list of your files in three columns.
|
|
The program
|
|
.UL wc
|
|
counts the number of lines, words and characters in
|
|
its input, and as we saw earlier,
|
|
.UL who
|
|
prints a list of currently-logged on people,
|
|
one per line.
|
|
Thus
|
|
.P1
|
|
who | wc
|
|
.P2
|
|
tells how many people are logged on.
|
|
And of course
|
|
.P1
|
|
ls | wc
|
|
.P2
|
|
counts your files.
|
|
.PP
|
|
Any program
|
|
that reads from the terminal
|
|
can read from a pipe instead;
|
|
any program that writes on the terminal can drive
|
|
a pipe.
|
|
You can have as many elements in a pipeline as you wish.
|
|
.PP
|
|
Many
|
|
.UC UNIX
|
|
programs are written so that they will take their input from one or more files
|
|
if file arguments are given;
|
|
if no arguments are given they will read from the terminal,
|
|
and thus can be used in pipelines.
|
|
.UL pr
|
|
is one example:
|
|
.P1
|
|
pr -3 a b c
|
|
.P2
|
|
prints files
|
|
.UL a ,
|
|
.UL b
|
|
and
|
|
.UL c
|
|
in order in three columns.
|
|
But in
|
|
.P1
|
|
cat a b c | pr -3
|
|
.P2
|
|
.UL pr
|
|
prints the information coming down the pipeline,
|
|
still in
|
|
three columns.
|
|
.SH
|
|
The Shell
|
|
.PP
|
|
We have already mentioned once or twice the mysterious
|
|
``shell,''
|
|
which is in fact
|
|
.UL sh (1).
|
|
The shell is the program that interprets what you type as
|
|
commands and arguments.
|
|
It also looks after translating
|
|
.UL * ,
|
|
etc.,
|
|
into lists of filenames,
|
|
and
|
|
.UL < ,
|
|
.UL > ,
|
|
and
|
|
.UL |
|
|
into changes of input and output streams.
|
|
.PP
|
|
The shell has other capabilities too.
|
|
For example, you can run two programs with one command line
|
|
by separating the commands with a semicolon;
|
|
the shell recognizes the semicolon and
|
|
breaks the line into two commands.
|
|
Thus
|
|
.P1
|
|
date; who
|
|
.P2
|
|
does both commands before returning with a prompt character.
|
|
.PP
|
|
You can also have more than one program running
|
|
.ul
|
|
simultaneously
|
|
if you wish.
|
|
For example, if you are doing something time-consuming,
|
|
like the editor script
|
|
of an earlier section,
|
|
and you don't want to wait around for the results before starting something else,
|
|
you can say
|
|
.P1
|
|
ed file <script &
|
|
.P2
|
|
The ampersand at the end of a command line
|
|
says ``start this command running,
|
|
then take further commands from the terminal immediately,''
|
|
that is,
|
|
don't wait for it to complete.
|
|
Thus the script will begin,
|
|
but you can do something else at the same time.
|
|
Of course, to keep the output from interfering
|
|
with what you're doing on the terminal,
|
|
it would be better to say
|
|
.P1
|
|
ed file <script >script.out &
|
|
.P2
|
|
which saves the output lines in a file
|
|
called
|
|
.UL script.out .
|
|
.PP
|
|
When you initiate a command with
|
|
.UL & ,
|
|
the system
|
|
replies with a number
|
|
called the process number,
|
|
which identifies the command in case you later want
|
|
to stop it.
|
|
If you do, you can say
|
|
.P1
|
|
kill process\(hynumber
|
|
.P2
|
|
If you forget the process number,
|
|
the command
|
|
.UL ps
|
|
will tell you about everything you have running.
|
|
(If you are desperate,
|
|
.UL kill\ 0
|
|
will kill all your processes.)
|
|
And if you're curious about other people,
|
|
.UL ps\ a
|
|
will tell you about
|
|
.ul
|
|
all
|
|
programs that are currently running.
|
|
.PP
|
|
You can say
|
|
.P1 1
|
|
(command\(hy1; command\(hy2; command\(hy3) &
|
|
.P2
|
|
to start three commands in the background,
|
|
or you can start a background pipeline with
|
|
.P1
|
|
command\(hy1 | command\(hy2 &
|
|
.P2
|
|
.PP
|
|
Just as you can tell the editor
|
|
or some similar program to take its input
|
|
from a file instead of from the terminal,
|
|
you can tell the shell to read a file
|
|
to get commands.
|
|
(Why not? The shell, after all, is just a program,
|
|
albeit a clever one.)
|
|
For instance, suppose you want to set tabs on
|
|
your terminal, and find out the date
|
|
and who's on the system every time you log in.
|
|
Then you can put the three necessary commands
|
|
.UL tabs , (
|
|
.UL date ,
|
|
.UL who )
|
|
into a file, let's call it
|
|
.UL startup ,
|
|
and then run it with
|
|
.P1
|
|
sh startup
|
|
.P2
|
|
This says to run the shell with the file
|
|
.UL startup
|
|
as input.
|
|
The effect is as if you had typed
|
|
the contents of
|
|
.UL startup
|
|
on the terminal.
|
|
.PP
|
|
If this is to be a regular thing,
|
|
you can eliminate the
|
|
need to type
|
|
.UL sh :
|
|
simply type, once only, the command
|
|
.P1
|
|
chmod +x startup
|
|
.P2
|
|
and thereafter you need only say
|
|
.P1
|
|
startup
|
|
.P2
|
|
to run the sequence of commands.
|
|
The
|
|
.UL chmod (1)
|
|
command marks the file executable;
|
|
the shell recognizes this and runs it as a sequence of commands.
|
|
.PP
|
|
If you want
|
|
.UL startup
|
|
to run automatically every time you log in,
|
|
create a file in your login directory called
|
|
.UL .profile ,
|
|
and place in it the line
|
|
.UL startup .
|
|
When the shell first gains control when you log in,
|
|
it looks for the
|
|
.UL .profile
|
|
file and does whatever commands it finds in it.\(dg
|
|
.FS
|
|
\(dg The c shell instead reads a file called
|
|
.UL .login
|
|
.
|
|
.FE
|
|
We'll get back to the shell in the section
|
|
on programming.
|