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ê?

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.


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.


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.


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.