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.