So Wikipedia (link) tells me that the command pwd is short for "print working directory", and that makes sense. But for the environment variable, the "P" has to be an acronym for something else t...
If bash encounters $(pwd) it will execute the command pwd and replace $(pwd) with this command's output. $PWD is a variable that is almost always set. pwd is a builtin shell command since a long time.
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:
In cases where PWD is set to the pathname that would be output by pwd -P, if there is insufficient permission on the current working directory, or on any parent of that directory, to determine what that pathname would be, the value of PWD is unspecified. Assignments to this variable may be ignored.
Then that will add the current directory (pwd is a command that prints the path of the current directory, and `pwd` will be replaced with the output of pwd) to the PATH variable for the duration of your current shell session (util you close the terminal).
What is the difference between cwd and pwd? I've tried googling it, and one of the answers mentioned that depending on some factor (which I sadly do not remember), the implementation (the code I'm assuming) is not the same?
Note that calling pwd -P (Physical) will report the correct directory, even if it is a shell builtin (tested inside bash). And, after pwd -P reports the correct value, the memory value gets updated and plain pwd will reort it correctly also.
With Zsh it's as simple as ${(D)PWD}. See under "Parameter Expansion Flags" in zshexpn (1): D Assume the string or array elements contain directories and attempt to substitute the leading part of these by names. The remainder of the path (the whole of it if the leading part was not substituted) is then quoted so that the whole string can be used as a shell argument. This is the reverse of ...
Is there a difference between pwd and cd (no arguments)? They both print the current directory's path but is there a subtle difference that I'm missing, and if so, when should I use which?