Por que um link para um diretório pode ser criado com ou sem a barra final?

2

Descobri que, ao criar um link simbólico para uma pasta, ele é produzido com ou sem a barra final com base em sua entrada. por exemplo:

$ ln -sfv /ln-test/FOLDER/ test-tail
test-tail -> /ln-test/FOLDER/

$ ln -sfv /ln-test/FOLDER test-notail
test-notail -> /ln-test/FOLDER

$ ll /ln-test
total 16
drwxr-xr-x  2 user  wheel    68B  2 Aug 08:35 FOLDER
lrwxr-xr-x  1 user  wheel    15B  2 Aug 08:36 test-notail -> /ln-test/FOLDER
lrwxr-xr-x  1 user  wheel    16B  2 Aug 08:36 test-tail -> /ln-test/FOLDER/

No exemplo acima testado em minhas caixas Mac e Debian, o link resultante corresponde à barra final da entrada.

Pelo que entendi, isso provavelmente não importa, mas recentemente nós encontramos um bug no Objective-c que é o resultado de ter uma barra final. Ainda precisamos rastrear esse bug, mas refazer o link sem a barra final corrige o problema.

Então, minha verdadeira pergunta é; deve importar se um link para um diretório tiver uma barra ou não?

    
por hoss 02.08.2017 / 15:17

2 respostas

3

Acessar um arquivo por meio de um link simbólico é equivalente a substituir o nome base do arquivo pelo texto do link simbólico se o texto do link simbólico não iniciar com / (link relativo) e a substituir o caminho completo do arquivo pelo texto do link simbólico se o link simbólico começa com / (link absoluto). Se houver uma barra no texto do link simbólico, que seja.

Uma barra no final de um nome de arquivo significa “o arquivo deve ser um diretório”. Se o destino do link for um diretório, o acesso a um arquivo resultará em um caminho calculado que contém duas barras: uma do texto da ligação simbólica e outra como o separador de diretório. Dado

lrwxr-xr-x  1 user  wheel    15B  2 Aug 08:36 test-notail -> /ln-test/FOLDER
lrwxr-xr-x  1 user  wheel    16B  2 Aug 08:36 test-tail -> /ln-test/FOLDER/

então test-notail/foo é equivalente a /ln-test/FOLDER/foo e test-tail/foo é equivalente a /ln-test/FOLDER//foo .

Várias barras são tão boas quanto uma (com uma exceção: um caminho que começa com exatamente duas barras, em alguns sistemas). Portanto, uma barra à direita (ou várias barras à direita) em um link simbólico para um diretório não faz diferença no sistema.

Se uma barra extra fizer diferença em um aplicativo, isso é um erro no aplicativo.

    
por 03.08.2017 / 02:52
2

Para o aplicativo, não, isso não deve importar. O link sem a barra final é (em um nível inferior ao que você normalmente pensaria) um link para o arquivo chamado FOLDER , um arquivo que por acaso é um diretório. O link com a barra final é explicitamente para um diretório chamado FOLDER . Como um contra-exemplo:

$ mkdir test
$ cd test
$ touch foo
$ ll
drwxrwxr-x.   2 jwbernin jwbernin  4096 Aug  2 09:33 .
drwx------. 102 jwbernin jwbernin 20480 Aug  2 09:33 ..
-rw-rw-r--.   1 jwbernin jwbernin     0 Aug  2 09:33 foo
$ ln -s foo/ TRAIL
$ ll
drwxrwxr-x.   2 jwbernin jwbernin  4096 Aug  2 09:33 .
drwx------. 102 jwbernin jwbernin 20480 Aug  2 09:33 ..
-rw-rw-r--.   1 jwbernin jwbernin     0 Aug  2 09:33 foo
lrwxrwxrwx.   1 jwbernin jwbernin     4 Aug  2 09:33 TRAIL -> foo/

O destaque colorido não é mostrado, mas esse último é um link quebrado. Se você ln -s foo NOTRAIL , a entrada NOTRAIL é um link válido para o arquivo foo . Como foo não é um diretório, o link usando a barra final termina quebrado.

Todos os diretórios são arquivos (para o sistema operacional), mas nem todos os arquivos são diretórios.

    
por 02.08.2017 / 15:37