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 () (symbolic links). As article 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 () (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%
hardpaths; the bash variable is nolinks. If you set the shell variable (usually in your shell setup file ()), 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 () 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 () 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