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?
- 35,771
- 44
- 128
- 188
2 Answers
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.
- 100,812
-
One difference is that using $PWD when available will avoid forking a subcomand like echo or pwd. This makes it advantageous for performance and program tracing. – Joe Atzberger Jun 04 '14 at 18:55
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.
- 27,708