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