Concordando com @BinaryZebra, é justo ressaltar que esta pergunta foi feita antes (por exemplo, Remove um diretório de dentro usando a interface de linha de comando [duplicado] , e pode ser citado ad infinitum ), e os recursos observáveis são bem conhecidos.
O comentário sobre o comportamento relacionado ao POSIX é mais interessante, já que ele pode fornecer algumas informações sobre o comportamento esperado . Os documentos POSIX relevantes são
- sh-shell, o interpretador de linguagem de comando padrão
- cd - altera o diretório de trabalho
- pwd - retorna o nome do diretório de trabalho
Na seção Uso do aplicativo do cd, é observado
Since cd affects the current shell execution environment, it is always provided as a shell regular built-in.
Na seção Descrição do cd, o item 10 fornece as informações mais relevantes:
- The cd utility shall then perform actions equivalent to the chdir() function called with curpath as the path argument. If these actions fail for any reason, the
cd
utility shall display an appropriate error message and the remainder of this step shall not be executed. If the-P
option is not in effect, thePWD
environment variable shall be set to the value that curpath had on entry to step 9 (i.e., before conversion to a relative pathname). If the-P
option is in effect, thePWD
environment variable shall be set to the string that would be output bypwd -P
. If there is insufficient permission on the new directory, or on any parent of that directory, to determine the current working directory, the value of thePWD
environment variable is unspecified.
Ou seja, PWD
é uma saída do comando cd
, em vez de uma entrada e, como tal, é amplamente ignorada pelo comando cd
. Tome nota da declaração final sobre "não especificado". POSIX se recusa a dizer o que acontece com $PWD
no caso de uma chamada para chdir()
falhar.
Na discussão de Variáveis de ambiente para pwd
, as notas POSIX referentes a PWD
:
An absolute pathname of the current working directory. If an application sets or unsets the value of
PWD
, the behavior ofpwd
is unspecified.
Ou seja, POSIX se recusa a especificar qualquer outra forma que $PWD
possa ser definida, exceto como um uso bem-sucedido do comando cd
(por sua vez, correspondendo uma chamada bem-sucedida a chdir()
).
Em nenhum documento existe texto que possa ser interpretado como dizendo que o caminho é "cacheado", mas apenas que o diretório de trabalho existe (presumivelmente como um valor ) dentro do Ambiente de execução de shell . A discussão do cd
em si não menciona a possibilidade de um diretório continuar a existir sem um nome. O documento cd
em si também não dá atenção a um diretório não existente. Isso é feito na descrição da função chdir()
como uma das várias causas de falha. Por exemplo
[ENOENT]
A component of path does not name an existing directory or path is an empty string.
A descrição de chdir()
não menciona nenhum tratamento especial de "."
, talvez porque POSIX evita descrever em detalhes o procedimento pelo qual um caminho absoluto é calculado usando getcwd()
, por exemplo, permitindo sistemas de arquivos sem "."
e ".."
. Em caso afirmativo, alguém poderia ter acrescentado um texto para indicar que as implementações podem tratar chdir(".")
como não operacional.
Voltando ao passo 10, diz explicitamente:
If these actions fail for any reason, the cd utility shall display an appropriate error message and the remainder of this step shall not be executed.
A atualização de PWD
é feita após essa sentença, portanto, não há possibilidade de alterar o valor em caso de falha.
Voltando a pwd
, diz da opção -L
If the
PWD
environment variable contains an absolute pathname of the current directory that does not contain the filenames dot or dot-dot,pwd
shall write this pathname to standard output.
e mais tarde
If neither
-L
nor-P
is specified, thepwd
utility shall behave as if-L
had been specified.
Portanto, há uma cadeia de atos, mas em nenhum lugar uma declaração explícita de que o shell usa a variável PWD
como o contêiner do diretório de trabalho. Em vez disso, há os pontos anotados como não especificados que permitem a possibilidade de que algum aplicativo compatível com POSIX possa escolher uma maneira diferente de organizar seus dados, desde que atenda aos pontos de agir como se fossem.