## 1.16. Making Pathnames

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.

#### Figure 1-4. Part of a Unix filesystem tree

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:

If the pathname begins with `/`
  It is an absolute path, starting from the root.
If the pathname begins with `~` 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`).
If the pathname does not begin with a `/`
  The pathname is relative to the current directory. Two relative special cases use entries that are in every Unix directory:

  1. 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.

  2. 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.

> NOTE: 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

Copyright © 2003 O'Reilly & Associates. All rights reserved.