cd's '-e' opção

1

De acordo com a página de manual do Bash, a opção -e de cd leva a um status de retorno malsucedido após uma alteração bem-sucedida do diretório .

If the -e option is supplied with -P and the current working directory cannot be successfully determined after a successful directory change, cd will return an unsuccessful status.

$ cd
$ mkdir -p test/a/b
$ cd test/a/b
$ rmdir ../b ../../a
$ cd -Pe ..; echo $?
cd: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory
1

Por que o retorno acima de 1 ? Como poderia cd -Pe .. ter feito uma mudança de diretório bem-sucedida se os diretórios corrente e pai não existissem mais?

Além disso, se eu quiser que cd retorne um status de retorno malsucedido toda vez que não puder mudar para o diretório desejado, quais são as situações em que devo adicionar -Pe ? Pelo que entendi, só é necessário se . ou .. forem usados no argumento de cd .

    
por terdon 07.03.2018 / 17:40

2 respostas

1

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.

    
por 07.03.2018 / 18:00
2

1 como um código de saída indica falha, não sucesso. Portanto, cd -Pe .. está indicando corretamente que não foi possível determinar o diretório atual após a alteração.

Até onde eu sei, você está certo quando -Pe é necessário. Em outros casos, por exemplo, se você tiver um link simbólico quebrado para um diretório excluído, cd falhará com uma mensagem de erro e um código de saída de 1 sem -Pe .

Veja Exemplos de opções para bash cd, por exemplo: cd -Pe @ $ directory para saber mais sobre isso. ..

    
por 07.03.2018 / 17:45