Para o que não funciona, se olharmos para o resultado ls -l
, obtemos o seguinte:
[sparticvs@sparta test]$ ls -l build/
total 0
lrwxrwxrwx. 1 sparticvs sparticvs 6 Dec 17 16:08 client -> client
Agora, entenda o que está acontecendo aqui. Vamos ver o comando que você chamou:
ln -s client build/client
De acordo com a Man Page, existem duas correspondências possíveis para este formato
SYNOPSIS
ln [OPTION]... [-T] TARGET LINK_NAME (1st form)
ln [OPTION]... TARGET... DIRECTORY (3rd form)
Ele corresponderá no primeiro formulário (desde o primeiro). Agora, o "nome de destino" ou client
no seu caso, pode ser (de acordo com o manual completo ln
) seqüências arbitrárias. Eles não precisam resolver nada agora, mas podem resolver algo no futuro. O que você está criando com sua invocação é um "link simbólico pendente" e o sistema não impede que você crie esses arquivos.
Agora, sua segunda invocação ln -s ../client build/client
é o que é chamado de "link simbólico relativo" (como você observou em seu próprio post). Existe um segundo tipo e esse é um "symlink absoluto" que seria chamado fazendo ln -s /home/user/client build/client
.
Isso é não um bug. De acordo com o manual, afirma:
When creating a relative symlink in a different location than the current directory, the resolution of the symlink will be different than the resolution of the same string from the current directory. Therefore, many users prefer to first change directories to the location where the relative symlink will be created, so that tab-completion or other file resolution will find the same target as what will be placed in the symlink.
-- from
info coreutils 'ln invocation'
Dito isto, você DEVE usar o caminho relativo ou absoluto para o alvo.