Eu tenho a seguinte estrutura de arquivo:
build/
client/
–> index.js
E quando tento criar um link simbólico chamado "cliente" dentro do diretório de compilação que se refere ao diretório de clientes no cwd, assim
// Fails
$ pwd
/home/user/
$ ln -s client build/client
$ stat build/client/index.js
stat: build/client/index.js: stat: Too many levels of symbolic links
Eu recebo o erro ELOOP exibido acima. Quando eu mudo o caminho de destino para ser relativo ao caminho de destino, tudo fica bem:
// Works
$ pwd
/home/user/
$ ln -s ../client build/client
$ stat build/client/index.js
stat: <outputs file stats>
Esse é o comportamento pretendido e explique por que ...
Respostas:
Para aquele que não funciona, se olharmos para o
ls -l
resultado, obtemos o seguinte:Agora, para entender o que está acontecendo aqui. Vamos dar uma olhada no comando que você chamou:
De acordo com a página do manual, há duas correspondências possíveis para este formato
Ele corresponderá no primeiro formulário (desde o primeiro). Agora, o "nome do destino" ou,
client
no seu caso, pode ser (de acordo com oln
manual completo ) seqüências arbitrárias. Eles não precisam resolver nada agora, mas podem resolver algo no futuro. O que você está criando com sua chamada é um "link simbólico dangling" e o sistema não impede que você os crie.Agora sua segunda invocação
ln -s ../client build/client
é chamada de "link simbólico relativo" (como você observou em sua própria postagem). Existe um segundo tipo e esse é um "link simbólico absoluto" que seria chamado por fazerln -s /home/user/client build/client
.Isso não é um bug. De acordo com o manual, afirma:
Dito isto, você DEVE usar o caminho relativo ou absoluto para o alvo.
fonte
Este é realmente o comportamento pretendido. Na
ln(1)
página do manual:Quanto ao porquê disso, imagine se o link simbólico fosse interpretado em relação à sua origem e não ao seu destino. Ao resolvê-lo posteriormente, você precisaria saber qual era o seu CWD quando o criou, o que não faz sentido, e muito menos é impossível.
Além disso, dessa maneira, você obtém um método limpo e compacto para criar uma estrutura de diretório esquelética que pode ser solta em qualquer lugar na árvore de diretórios sem quebrar os links simbólicos.
Para dar um exemplo do que quero dizer, digamos que você esteja trabalhando em um projeto e tenha uma estrutura de diretórios inteira configurada para isso da seguinte maneira:
Agora, suponha que você deseje criar um link simbólico para
widgets/
dentrowizardry/
. Você tem duas opções:ou
Se você tentar se mover para
/home/you/project
outro lugar, um link simbólico criado com o primeiro formulário será interrompido porque está procurando/home/you/project/widgets
. O segundo formulário manterá o link simbólico funcional, pois ele procura em../widgets
relação ao local em que está, independentemente de onde esse local possa estar na árvore de diretórios.fonte