[Chapter 14] 14.13 Which Directory Am I in, Really?
Author: Jerry Peek, Tim O'Reilly & Mike Loukides
Date: 1998-08-04T21:37:12Z

#

| Chapter 14 Moving Around in a Hurry |

## 14.13 Which Directory Am I in, Really?

The C shell, and some other shells too, keep their own idea of what your current directory is. The csh will give you the current directory's absolute pathname in `$cwd`; bash uses `$PWD`. But sometimes this can give you the wrong pathname.

Why? Because the cwd variable was added before many versions of UNIX had symlinks (18.4) (symbolic links). As article 18.7 explains, symlinks can point to directories any place else on the filesystem or even (for some UNIXes) directories on another computer. Poor cwd couldn't cope: it assumed that the current directory was the name of the symlink itself (instead of the directory that the link points to). That led to problems like the one below: cding to a "directory" named wpa that's actually a symlink to /work/pwrtools/articles. The value of `$cwd`, shown in the prompt, is wrong. The /bin/pwd command shows the real current directory (14.4) (you should type all of `/bin/pwd` because some shells and users have plain `pwd` aliased to do `echo` `$cwd`):

>     /home/jerry% pwd
>     /home/jerry% ls -l wpa
>     lrwxrwxrwx  1 jerry  23 Sep 8 13:55 wpa -> /work/pwrtools/articles
>     /home/jerry% cd wpa
>     /home/jerry/wpa% /bin/pwd
>     /work/pwrtools/articles
>     /home/jerry/wpa%

By now, a lot of C shells have a variable named hardpaths; the bash variable is nolinks. If you set the shell variable (usually in your shell setup file (2.2)), the shell won't be fooled by symlinks. Watch:

>     /home/jerry/wpa% cd
>     /home/jerry% set hardpaths      (on bash, nolinks=1)

>     /home/jerry% cd wpa
>     /work/pwrtools/articles%

Setting hardpaths or nolinks makes the shell do extra work, so don't bother with it unless you use `$cwd`.

The dirs (14.6) command has the same problem. Setting hardpaths or nolinks helps there, too.

If your system has symlinks but your shell doesn't recognize a variable like hardpaths, here are workarounds for the .cshrc file:

>     alias setprompt 'set prompt="${cwd}% "'
>     alias cd        'chdir \!* && set cwd=`/bin/pwd` && setprompt'
>     alias pushd     'pushd \!* && cd .'
>     alias popd      'popd \!* && cd .'

When you cd, that alias resets the cwd variable to the output of /bin/pwd, then resets the prompt to the new cwd. Using pushd or popd (14.6) runs the cd alias, too - this changes to the current directory (`.`), which fixes cwd (as well as the dirs command) and resets the prompt.

Whew. Are symlinks worth the work? (I think they are.)

- JP

14.12 Marking Your Place with a Shell Variable |  | 14.14 Automatic Setup When You Enter/Exit a Directory