O que é $ PWD? (vs diretório de trabalho atual)

27

Então a Wikipedia ( link ) me diz que o comando pwdé abreviado para "print working directory", e isso faz sentido.

Mas para a variável de ambiente, o "P" deve ser um acrônimo para algo que não seja impressão.

Eu ouço pessoas falando sobre o "diretório de trabalho atual", que soa melhor e é mais intuitivo, mas ainda assim a variável de ambiente parece ser chamada de $ PWD, e não $ CWD. Ninguém nunca diz "Você verificou a variável de diretório de trabalho de impressão?".

Atualmente, estou brincando com o servidor de aplicativos da web uWSGI e, ao executá-lo, informa-me (na página de estatísticas do uWSGI):

"cwd":"/home/velle/greendrinks",

para que eles, obviamente, como o (sigla mais intuitivo) cwdsobre pwd.

Acho que estou tentando descobrir se entendi mal alguma coisa, ou se é apenas uma questão de ter dado à variável de ambiente um nome não intuitivo?

Mads Skjern
fonte
5
Diretório de trabalho atual?
DarioP
3
Eu suspeito que você está pensando demais. $PWDé equivalente a `pwd`, e isso foi justificativa suficiente.
aquele outro cara
1
Outro palpite: Process Working Directory?
oxfn 21/04

Respostas:

23

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]

    Imprima o nome do diretório de trabalho atual.

    Opções:

      -L
          imprima o valor de $PWD se nomear o diretório de trabalho atual
      -P
          imprime o diretório físico, sem nenhum link simbólico

    Por padrão, 'pwd' se comporta como se '-L' tivesse sido especificado.

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.

Fonte /ubuntu//a/476633/291937

Thushi
fonte
1
@llua Nada proíbe PWDser uma variável de ambiente. Na verdade, é o caso padrão da maioria, se não de todos os shells, e faz sentido fornecê-lo aos processos filhos.
Jlliagre
1
Eu me pergunto por que as pessoas votaram mal, parece uma boa resposta e são bem explicadas.
Mads Skjern
2
@MadsSkjern A maioria dos recursos internos necessários para o padrão POSIX também estão disponíveis como comandos. Isso permite chamá-los diretamente de outros programas sem a necessidade de iniciar um shell.
Jlliagre
2
Isso realmente não responde à pergunta para mim. A questão não é realmente sobre as diferenças entre $PWDe pwd(que já foram abordadas em U&L antes de eu acreditar), mas sobre os motivos que levaram a nomear a variável " PWD".
John WH Smith
1
@ Thushi Você provavelmente está correto. O PWD foi introduzido por ksh88esse documento como: PWD The present working directory set by the cd command.Você deve adicionar isso à sua resposta.
Jlliagre
15

$ DTD é a P athname da corrente W orking D irectory

Quando houver links simbólicos, poderão haver resultados diferentes, da leitura de $ PWD à execução do comando pwd .

jcbermu
fonte
Você poderia dar um exemplo de como obter valores diferentes para $PWDe pwd?
Mads Skjern