Diferença de uso entre pwd e $ PWD

9

Para imprimir a variável $PWD e o comando do ambiente de diretório de trabalho atual / presente, pwdestão disponíveis. Então, qual é a diferença no uso de ambos? ou O que deve ser escolhido para uma finalidade específica?

Pandya
fonte

Respostas:

10

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.

Terdon
fonte
Uma diferença é que o uso de $ PWD quando disponível evitará bifurcar um subcomando como echo ou pwd. Isso o torna vantajoso para desempenho e rastreamento de programa.
Joe Atzberger
3

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.

jobin
fonte