Difference in Use between pwd and $PWD

To print current/present working directory environment variable $PWD and command pwd are available. So, What is difference in usage of both? or What should be chose for specific purpose?


Solution 1:

That depends on what you're doing. First of all, $PWD is an environment variable and pwd is a shell builtin or an actual binary:

$ type -a pwd
pwd is a shell builtin
pwd is /bin/pwd

Now, the bash builtin will simply print the current value of $PWD unless you use the -P flag. As explained in help pwd:

pwd: pwd [-LP]
Print the name of the current working directory.

Options:
  -L    print the value of $PWD if it names the current working
    directory
  -P    print the physical directory, without any symbolic links

By default, `pwd' behaves as if `-L' were specified.

The pwd binary, on the other hand, gets the current directory through the getcwd(3) system call which returns the same value as readlink -f /proc/self/cwd. To illustrate, try moving into a directory that is a link to another one:

$ ls -l
total 4
drwxr-xr-x 2 terdon terdon 4096 Jun  4 11:22 foo
lrwxrwxrwx 1 terdon terdon    4 Jun  4 11:22 linktofoo -> foo/
$ cd linktofoo
$ echo $PWD
/home/terdon/foo/linktofoo
$ pwd
/home/terdon/foo/linktofoo
$ /bin/pwd
/home/terdon/foo/foo

So, in conclusion, on GNU systems (such as Ubuntu), pwd and echo $PWD are equivalent unless you use the -P option but /bin/pwd is different and behaves like pwd -P.

Solution 2:

Both will return the same result if you use them without options for all working directories, including when in symbolic links.

However, from man pwd:

-P, --physical
    avoid all symlinks

This would mean executing pwd -P when in symbolic links which point to some other directories will print the path to the original directory.

As an example, if you have a symbolic link /var/run that points to /run and you are currently in /var/run/ directory, executing

echo $PWD

will return:

/var/run

and will be the same for pwd. However, if you execute:

pwd -P

will return

/run

Thus, it depends which path you require: the actual path without symbolic links or the present directory ignoring the symbolic links. The only difference between between pwd -P and echo $PWD is when there are symbolic links.