Respostas:
Isso depende do que você está fazendo. Primeiro de tudo, $PWDé uma variável de ambiente e pwdé um shell embutido ou um binário real:
$ type -a pwd
pwd is a shell builtin
pwd is /bin/pwd
Agora, o bash embutido simplesmente imprimirá o valor atual de, a $PWDmenos que você use o -Psinalizador. Como explicado em 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.
O pwdbinário, por outro lado, obtém o diretório atual através da getcwd(3)chamada do sistema, que retorna o mesmo valor que readlink -f /proc/self/cwd. Para ilustrar, tente mudar para um diretório que é um link para outro:
$ 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
Portanto, em conclusão, nos sistemas GNU (como o Ubuntu) pwde echo $PWDsão equivalentes, a menos que você use a -Popção, mas /bin/pwdseja diferente e se comporte como pwd -P.
Ambos retornarão o mesmo resultado se você os usar sem opções para todos os diretórios de trabalho, inclusive quando estiver em links simbólicos.
No entanto, de man pwd:
-P, --physical
avoid all symlinks
Isso significaria executar pwd -Pquando em links simbólicos que apontam para outros diretórios imprimir o caminho para o diretório original.
Como exemplo, se você tiver um link simbólico /var/runque aponte para /rune você estiver atualmente no /var/run/diretório, executando
echo $PWD
retornará:
/var/run
e será o mesmo para pwd. No entanto, se você executar:
pwd -P
retornará
/run
Portanto, depende de qual caminho você deseja: o caminho real sem links simbólicos ou o diretório atual ignorando os links simbólicos. A única diferença entre pwd -Pe echo $PWDé quando existem links simbólicos.