Por que meu link simbólico não funciona?

18

Estou tentando entender melhor os links simbólicos ... e não ter muita sorte. Esta é minha saída real do shell com nome de usuário / host alterado:

username@host:~$ mkdir actual
username@host:~$ mkdir proper
username@host:~$ touch actual/file-1.txt
username@host:~$ echo "file 1" > actual/file-1.txt
username@host:~$ touch actual/file-2.txt
username@host:~$ echo "file 2" > actual/file-2.txt
username@host:~$ ln -s actual/file-1.txt actual/file-2.txt proper
username@host:~$ # Now, try to use the files through their links
username@host:~$ cat proper/file-1.txt
cat: proper/file-1.txt: No such file or directory
username@host:~$ cat proper/file-2.txt
cat: proper/file-2.txt: No such file or directory
username@host:~$ # Check that actual files do in fact exist
username@host:~$ cat actual/file-1.txt
file 1
username@host:~$ cat actual/file-2.txt
file 2
username@host:~$ # Remove the links and go home :(
username@host:~$ rm proper/file-1.txt
username@host:~$ rm proper/file-2.txt

Eu pensei que um link simbólico deveria operar de forma transparente, no sentido de que você poderia operar o arquivo para o qual ele aponta como se estivesse acessando o arquivo diretamente (exceto, é claro, no caso de rm onde Claro que o link é simplesmente removido).

    
por orokusaki 28.11.2012 / 16:47

4 respostas

39

Os links simbólicos tendem a gostar de caminhos completos ou relativos ao link, caso contrário, eles podem estar procurando file-1.txt localmente (por incrível que pareça).

Navegue até proper e execute ls -l e você verá que o link simbólico está procurando por actual/file-1.txt , quando deveria ser ../actual/file-1.txt .

Então você tem duas opções:

  1. Dê o caminho completo

    ln -s ~/actual/file-1.txt ~/actual/file-2.txt ~/proper
    
  2. Navegue até a pasta em que você deseja que o link esteja e vincule a partir dele

    cd proper
    ln -s ../actual/file-1.txt ../actual/file-2.txt ./
    

Editar : Uma dica para salvar a digitação.

Você pode fazer apenas ln -s ~/actual/file-{1,2}.txt ~/proper

Os itens nas chaves são substituídos e colocados um após o outro, criando o comando

ln -s ~/actual/file-1.txt ~/actual/file-2.txt ~/proper

que liga os dois arquivos ao diretório de destino. Salva algumas digitações importantes à medida que você avança no shell.

    
por 28.11.2012 / 17:18
2

O problema é o uso de caminhos relativos. Se você especificar sua criação de link com o caminho explícito completo, isso funcionará.

$ ln -s ~/actual/file1.txt ~/actual/file2.txt ~/proper/

$ cat proper/file1.txt

file 1

$

Seu exemplo cria links em proper que procuram por um subdiretório chamado real no diretório atual, em vez do pai / mãe pretendido.

    
por 28.11.2012 / 17:19
1

Links simbólicos podem ser complicados. Em essência, um link simbólico é um arquivo que contém um nome de arquivo / nome de caminho para outro arquivo (e que é sinalizado para tratamento especial). Se o nome do caminho no arquivo de link começar com " / ", ele será tratado como um nome de caminho absoluto e as coisas serão bem diretas. Se não começar com uma barra, ele será tratado como um nome de caminho relativo - relativo ao diretório em que o link está localizado. (Isso é verdade se o nome contém ou não barras.) Assim, você criou proper/file–1.txt como um link para " actual/file–1.txt " e, quando tentou acessá-lo, o sistema tentou acessar proper/actual/file–1.txt . Você deveria ter dito

ln –s  ../actual/file–1.txt  ../actual/file–2.txt  proper

A propósito, você não precisou dos comandos touch . echo "file 1" > actual/file–1.txt é suficiente para criar actual/file–1.txt .

    
por 28.11.2012 / 17:29
0

Um problema relacionado, e pode ser óbvio para muitos, mas fiquei perplexo comigo por alguns minutos: se você está criando um symlink dentro de um diretório que é convertido em symlink, ou há um symlink dentro do caminho do diretório atual , você pode entrar em problemas com links simbólicos não funcionando.

Use cd .. e ls -l repetidamente, para ver se seus diretórios pai são eles mesmos ligados por links simbólicos.

Se você precisar criar um link simbólico, cd para o diretório de destino original e criar novos links simbólicos, os caminhos relativos serão precisos.

Ou, dito de outra forma: o caminho relativo é da Origem para o Destino. Se a Origem for subseqüentemente ligada por links simbólicos, tudo bem. Mas você pode ter problemas para configurar um novo Origin link_name dentro de um diretório que seja, ele mesmo, de alguma forma symlinked.

    
por 20.08.2014 / 12:05