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:
cd
ing 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.)
-
![]() |
![]() |
![]() |
14.12 Marking Your Place with a Shell Variable |
![]() |
14.14 Automatic Setup When You Enter/Exit a Directory |