Shell mode keeps track of ‘cd’, ‘pushd’ and ‘popd’ commands given to the subshell, in order to keep the Shell buffer’s default directory (see File Names) the same as the shell’s working directory. It recognizes these commands by examining lines of input that you send.
If you use aliases for these commands, you can tell Emacs to
recognize them also, by setting the variables
shell-pushd-regexp, shell-popd-regexp, and
shell-cd-regexp to the appropriate regular expressions
(see Regexps). For example, if shell-pushd-regexp matches
the beginning of a shell command line, that line is regarded as a
pushd command. These commands are recognized only at the
beginning of a shell command line.
If Emacs gets confused about changes in the working directory of the subshell, type M-x dirs. This command asks the shell for its working directory and updates the default directory accordingly. It works for shells that support the most common command syntax, but may not work for unusual shells.
You can also use Dirtrack mode, a buffer-local minor mode that
implements an alternative method of tracking the shell’s working
directory. To use this method, your shell prompt must contain the
working directory at all times, and you must supply a regular
expression for recognizing which part of the prompt contains the
working directory; see the documentation of the variable
dirtrack-list for details. To use Dirtrack mode, type M-x
dirtrack-mode in the Shell buffer, or add
shell-mode-hook (see Hooks).