Erro estranho (?) quando executo o comando 'man' de uma pasta que não existe mais

3

Vamos dar uma olhada nos seguintes:

radu@Radu:~$ mkdir test
radu@Radu:~$ cd test
radu@Radu:~/test$ rmdir ~/test
radu@Radu:~/test$ man ls
man: can't change directory to '': No such file or directory

Normalmente, eu diria que a última linha da saída anterior do meu terminal é um erro. Mas como eu posso entender isso? E por que isso aparece apenas no caso do comando man (até onde eu sei; mesmo pwd ou ls não tem nenhum problema)?

Além disso, vamos ver novamente:

radu@Radu:~/test$ man ls
man: can't change directory to '': No such file or directory
radu@Radu:~/test$ echo $?
0

O que? Foi um sucesso (veja a saída de man man |& grep -A 1 '^EXIT STATUS$' )?

Outra versão do homem

Quando tentado com outra versão de man , a mesma coisa funciona.

$ mkdir mantst
$ cd mantst/
$ man ls            <--- works
$ rmdir ../mantst/
$ man ls            <--- works
$ man --version
man 2.6.3
    
por Radu Rădeanu 18.04.2014 / 20:13

1 resposta

3

A diferença entre man e outros comandos como ls é que os últimos (aqueles que não se queixam de diretório inexistente) não tentam explicitamente alterar mas já fique lá. O homem também faz, mas também tenta explicitamente mudar para lá também.

Os diretórios do UNIX (como arquivos) não são excluídos imediatamente quando você chama unlink(2) ou rmdir(2) , mas apenas a entrada de diretório no diretório pai é removida. O diretório / arquivo permanece contanto que haja processos referenciando-os. Assim que a última referência é removida, o kernel efetivamente remove os blocos pertencentes aos arquivos / diretórios.

Por essa razão, não há erro quando você chama ls em um diretório que não existe mais, já que seu shell ainda está lá (ele faz referência ao diretório como seu diretório atual) e ls de lá herda essa propriedade . Mas como man explicitamente tenta chdir(2) lá, portanto, para um diretório entry que não existe mais, ele é liberado.

    
por 18.04.2014 / 20:36