Devo incluir uma barra final / em um link simbólico para um diretório?

30

A ligação simbólica a um diretório fornece resultados diferentes ls -ldependendo de eu ln -s dirou ln -s dir/. Mas qual é a diferença real e qual devo preferir por quê?

Tobias Kienzler
fonte

Respostas:

9

Não há diferença. (Haveria uma diferença se o destino não fosse um diretório existente.)

A barra final pode ter sido encerrada por causa da conclusão do shell: com algumas configurações, ln -s tarTabSpacelinktermina em ln -s target/ link.

Gilles 'SO- parar de ser mau'
fonte
A questão vinculada parece ser sobre várias barras sucessivas nos caminhos, mas não sobre barras finais nos links. Não sei se tem algo a dizer aqui.
Mwfearnley #
Na verdade, eu não deveria ter dito isso. Tem muito a dizer, sobre uma preocupação comum que está intimamente relacionada à questão. Eu não acho que leva até essa conclusão.
Mwfearnley #
@mwfearnley É uma consequência lógica: se foo -> bar/, em seguida, foo/quxé equivalente a bar//qux. Embora o título da pergunta, formalmente falando, não inclua foo -> bar/, também discuto esse caso na minha resposta.
Gilles 'SO- stop be evil'
Olá, obrigado por responder. Diz-me que os caminhos, incluindo links simbólicos, são equivalentes. Isso não me diz necessariamente o que acontece se eu acessar o link simbólico em si (sem uma barra), e sem ser um especialista em Unix, não sei necessariamente o que 'equivalência' significa ou não.
Mwfearnley #
Há pelo menos um caso em que isso faz diferença, então tive que rebater esta resposta.
Flimm
27

A única coisa em que consigo pensar é que ele "protege" você de alguém que exclui o diretório e cria um arquivo.

[user@host linktest]$ mkdir test
[user@host linktest]$ ln -s test/ slash
[user@host linktest]$ ln -s test noslash
[user@host linktest]$ ls -l
total 4
lrwxrwxrwx 1 paul paul    4 Feb 21 21:00 noslash -> test
lrwxrwxrwx 1 paul paul    5 Feb 21 21:00 slash -> test/
drwxrwxr-x 2 paul paul 4096 Feb 21 20:59 test
[user@host linktest]$ file *slash
noslash: symbolic link to `test'
slash: symbolic link to `test/'
[user@host linktest]$ rmdir test
[user@host linktest]$ file *slash
noslash: broken symbolic link to `test'
slash: broken symbolic link to `test/'
[user@host linktest]$ touch test
[user@host linktest]$ file *slash
noslash: symbolic link to `test'
slash: broken symbolic link to `test/'
[user@host linktest]$

A versão com a barra é interrompida quando o destino é substituído por um arquivo.

desenvolvimento
fonte
3

Pergunta interessante. Eu fiz um pequeno teste:

$ mkdir dir
$ ln -s dir/ test_slash
$ ln -s dir test_noslash
$ ls -l
total 4
drwxr-xr-x 2 vrusinov vrusinov 4096 Feb 21 16:41 dir
lrwxrwxrwx 1 vrusinov vrusinov    3 Feb 21 16:41 test_noslash -> dir
lrwxrwxrwx 1 vrusinov vrusinov    4 Feb 21 16:41 test_slash -> dir/
$ strace ls test_slash 2> trace_slash
$ strace ls test_noslash 2> trace_noslash
$ wc -l trace_*
   79 trace_noslash
   79 trace_slash
$ diff -u trace_* | less

Como você pode ver, não há diferença no número de chamadas do sistema (pelo menos para ls) e os rastreamentos são muito semelhantes. No entanto, este é apenas um teste de despejo e não tenho certeza - pode haver algumas diferenças.

rvs
fonte
Também estou imaginando se isso realmente faz diferença, mas por que essa barra adicional seria armazenada?
Tobias Kienzler 21/02
2

Sua pergunta é realmente sobre o comportamento do lsprograma.

1) Se você fizer ls -l $dironde $ dir é realmente um link simbólico, obterá informações sobre o link simbólico.

2) Se você fizer ls -lL $dironde $ dir é um link simbólico para um diretório, obterá informações sobre o diretório de destino.

3) Se você fizer ls -l $dir/., força o link simbólico a ser seguido e fornece informações sobre o diretório de destino.

4) Se o fizer ls -l $dir/, os resultados podem ser os mesmos que o número 1 ou o número 3, dependendo de qual versão lsestá sendo usada. Eu estava acostumado a uma versão mais antiga do Solaris, fazendo o # 1 e fiquei surpreso com o Linux, fazendo o # 3.

e qual devo preferir por quê?

Sem barra final, se você estiver preocupado se um nome de diretório fornecido é um diretório real versus um link simbólico para um diretório.

Com barra final, se você estiver mais preocupado com os arquivos no diretório em vez do próprio diretório.

Joe Inwap
fonte