Pathnames locate a file (or directory, or any other object) in the Unix filesystem. As you read this article, refer to Figure 1-4. It's a diagram of a (very) small part of a Unix filesystem.
Whenever you are using Unix, you have a current
directory. By default, Unix looks for any mentioned files or
directories within the current directory. That is, if you don't give an
absolute pathname (Section 1.14) (starting from the root,
/ ), Unix tries to look up files
relative to the current directory. When you first log
in, your current directory is your home
directory (Section
1.15), which the system administrator will assign to you. It typically
has a name like /u/mike or /home/mike.
You can change your current directory by giving the cd command, followed by the name of a new directory (for example,
cd /usr/bin
). You can find out your
current directory by giving the pwd ("print
working directory") command.
If your current directory is /home/mike and you give the
command cat textfile
, you are asking Unix to
locate the file textfile within the directory
/home/mike. This is equivalent to the absolute path
/home/mike/textfile. If you give the command cat notes/textfile
, you are asking Unix to locate
the file textfile within the directory
notes, within the current directory
/home/mike.
A number of abbreviations help you to
form relative pathnames more conveniently. You can use the abbreviation . (dot)
to refer to the current working directory. You can use ..
(dot dot) to refer to the parent of the current working
directory. For example, if your current directory is
/home/mike, ./textfile is the same
as textfile, which is the same as
/home/mike/textfile. The relative path
../gina/textfile is the same as
/home/gina/textfile; ..
moves up one level from /home/mike (to
/home) and then searches for the directory
gina and the file textfile.
You can use either the abbreviation
~
(tilde) or the environment variables
$HOME
or $LOGDIR
, to refer to your home directory. In most shells,
~
name
refers to the home directory of the user
name. See Section
31.11.
Here's a summary of the rules that Unix uses to interpret paths:
/
~
or with
~
name
Most shells turn it into an absolute pathname starting at your
home directory (~
) or at the home
directory of the user name (~
name
).
/
The pathname is relative to the current directory. Two relative special cases use entries that are in every Unix directory:
If
the pathname begins with ./
, the path is relative to the current
directory, e.g., ./textfile, though
this can also execute the file if it is given executable
file permissions.
If the pathname begins with ../
, the path is relative to the parent of
the current directory. For example, if your current
directory is /home/mike/work, then
../src means
/home/mike/src.
Section 10.2 explains where .
and ..
come
from.
The .
and ..
may appear at any point within a path. They mean "the
current directory at this point in the path" and "the parent of the current
directory at this point in the path." You commonly see paths starting with
../../
(or more) to refer to the
grandparent or great-grandparent of the current directory. However, they can
appear at other places in a pathname as well. For example,
/usr/ucb/./bin is the same as
/usr/ucb/bin, and
/usr/ucb/bin/../lib is the same as
/usr/ucb/lib. Placing .
or ..
in the middle of a
path may be helpful in building paths within shell scripts, but I have never
seen them used in any other useful way.
—ML and JP