Trailing barras em links simbólicos para diretórios

8

Estou tentando emular o processo de resolução de caminho (consulte a man_ path_resolution) em sistemas semelhantes a unix.

Meu sistema operacional é Linux com GNU coreutils 8.7.

Para esclarecer o significado de "/" na resolução, Eu fiz as seguintes coisas em um shell:

mkdir this_is_dir
ln -s this_is_dir this_is_link
rm this_is_link

Tudo estava bem, porque this_is_link é um link simbólico e eu o removi. Mas enquanto tenta:

mkdir this_is_dir
ln -s this_is_dir this_is_link
rm this_is_link/

Ecoou rm: cannot remove 'this_is_link/': Is a directory

Bem, o trailing '/' causou o seguimento do symlink, pensei. Então, eu tentei outro comando: rmdir this_is_link/

E um resultado engraçado foi lançado: rmdir: failed to remove 'this_is_link/': Not a directory

Não é o que eu esperava. Então pedi ao meu amigo para confirmar se o mesmo resultado poderia ser obtido em seu sistema. Ele tinha uma versão mais baixa de coreutils do que eu. E o resultado foi incrível, não importa rm ou rmdir 'this_is_link/' , o mesmo erro Not a directory ocorre .

E outro amigo acabou de experimentar em seu Mac OS, o resultado é: rm = > 'É um diretório', rmdir = > o diretório foi excluído com sucesso, o link permaneceu .

Existe alguma especificação sobre o comportamento exato da resolução do caminho?

    
por ymfoi 23.01.2012 / 10:38

2 respostas

7

A especificação POSIX / Single Unix especifica que um nome de caminho com uma barra final deve se referir a um diretório (ver < href="http://www.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap04.html#tag_04_11"> definições básicas §4.11 resolução do nome do caminho . foo/ é de fato definido como equivalente a foo/. (para propósitos de resolução de caminho, não ao manipular nomes de arquivos; basename e dirname ignoram barras finais). A maioria das implementações respeita isso, mas existem algumas exceções.

Isso explica o comportamento de rm this_is_link/ : é equivalente a rm this_is_link/. , em que o argumento é claramente um diretório.

rmdir this_is_link/ deve se referir ao diretório. Isso não acontece na sua máquina é um bug no GNU coreutils. O OSX está se comportando corretamente aqui.

    
por 24.01.2012 / 01:55
-1

Minha opinião:

  • '' rm link / '' falha porque o rm examina o último caractere, vê que é uma barra, mostra o diagnóstico (não muito correto) que você viu;
  • '' rmdir link / '' falha: o link não é um diretório, é um link simbólico
  • '' rm link '' será bem-sucedido
Por acaso, a resolução do caminho tem muito pouco a ver com isso, parece apenas '' rm '' cortar um canto em vez de (corretamente) invocar "stat" em um argumento (que é o que rmdir está fazendo). / p>

Felicidades.

    
por 23.01.2012 / 11:25