How could
cd -Pe ..
possibly have made a successful directory change if the current as well as the parent directories do not exist anymore?
Porque eles ainda existem, contanto que o seu shell (ou algum outro processo) os esteja abrindo, ou como seu diretório atual. Isso é semelhante a como os arquivos existem até que o usuário final os tenha fechado, embora com diretórios seja menos útil, já que você não pode ter arquivos neles (o diretório deve estar vazio quando desvinculado).
Mesmo sem -e
, cd
reclama, mas a alteração do diretório ainda passa como você viu. Aqui, podemos distinguir os diretórios das permissões, não que ainda seja de uso:
/tmp$ mkdir -p test/a/b
/tmp$ chmod 0700 test/a/b; chmod 0770 test/a
/tmp$ cd test/a/b
/tmp/test/a/b$ rmdir ../b ../../a
/tmp/test/a/b$ ls -ld .
drwx------ 0 user group 0 Mar 7 18:51 ./ # This is 'a'
/tmp/test/a/b$ cd -P ..
cd: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory
$ ls -ld .
drwxrwx--- 0 user group 0 Mar 7 18:51 ./ # this is 'b'
$ touch foo
touch: cannot touch 'foo': No such file or directory
Não consigo pensar em outra maneira de alterar o diretório de trabalho para um diretório cujo caminho completo não pôde ser determinado. É possível cd
em um diretório onde você não tem acesso de leitura aos diretórios intermediários. Mas mesmo nesse caso, você saberia o caminho que você tomou, diretamente ou analisando manualmente todos os links simbólicos do caminho.
E pelo menos no Linux, getcwd()
informa o caminho para o diretório atual, mesmo que o processo não possa ler os próprios nomes de diretórios intermediários.
Embora a página man mencione chroot
s e monte namespaces como possíveis métodos de um processo que está em um diretório, ele não pode acessar pelo nome.