Por que o comando “ln” precisa de um caminho absoluto?

5

Eu fiz um link simbólico usando o comando ln -s source target .

Na primeira tentativa, usei um caminho relativo e acabei com um broken symbolic link...

Pesquisando on-line, eu li que tenho que usar um caminho absoluto . Estou interessado em saber por que ele precisa ser um caminho absoluto em vez de um caminho relativo , o que é mais conveniente. Eu procurei e não encontrei uma resposta.

    
por cainiaofei 10.01.2018 / 04:17

2 respostas

5

Um link simbólico armazena o caminho que você dá quando você o cria. Caminhos não funcionam (links simbólicos estão quebrados), quando o arquivo não está realmente nesse caminho. Vamos fazer um symlink com um caminho relativo ...

zanna@toaster:~/playground$ mkdir linkyland anotherplace
zanna@toaster:~/playground$ cd linkyland
zanna@toaster:~/playground/linkyland$ ln -s sauce target
zanna@toaster:~/playground/linkyland$ file *
target: broken symbolic link to sauce

ln não se importa se o arquivo de origem existe (então se você fizer um erro de digitação no caminho, ele não irá reclamar). Vamos criar o arquivo que queremos vincular e ver se isso ajuda:

zanna@toaster:~/playground/linkyland$ > sauce
zanna@toaster:~/playground/linkyland$ file target
target: symbolic link to sauce

Agora o link funciona. Podemos usar apenas o nome da base (o último elemento do caminho) porque sauce está no mesmo diretório que target , então target pode armazenar o caminho sauce e isso é informação suficiente para encontrar o sauce quando precisamos.

zanna@toaster:~/playground/linkyland$ cd ../anotherplace
zanna@toaster:~/playground/anotherplace$ ln -s sauce target
zanna@toaster:~/playground/anotherplace$ file target
target: broken symbolic link to sauce

Esse link simbólico não funciona porque não há sauce aqui. O caminho sauce não é informação suficiente. (Deste ponto em diante, eu removi a parte user@host do meu prompt para facilitar a leitura, mas estou mostrando a parte que indica o diretório de trabalho atual, pois isso mostra como os comandos funcionam.) . Podemos corrigir isso usando um caminho absoluto para fazer o link simbólico:

~/playground/anotherplace$ rm target
~/playground/anotherplace$ ls -s /home/zanna/playground/linkyland/sauce target
~/playground/anotherplace$ file target
target: symbolic link to /home/zanna/playground/linkyland/sauce

No entanto, também podemos corrigi-lo fazendo um caminho relativo correto :

~/playground/anotherplace$ rm target 
~/playground/anotherplace$ ln -s ../linkyland/sauce target
~/playground/anotherplace$ file target
target: symbolic link to ../linkyland/sauce

Então a ideia de que precisamos de caminhos absolutos é ... apenas errada. Precisamos de um caminho correto, absoluto ou relativo.

Se os caminhos mudarem, links simbólicos com caminhos absolutos para arquivos na mesma quebra de diretório, mas aqueles com caminhos relativos não:

~/playground/anotherplace$ cd ../linkyland
~/playground/linkyland$ ln -s /home/zanna/playground/linkyland/sauce target2
~/playground/linkyland$ cd ..
~/playground$ mv linkyland elsewhere
~/playground$ file elsewhere/target*
elsewhere/target: symbolic link to sauce
elsewhere/target2: broken symbolic link to /home/zanna/playground/linkyland/sauce

Por isso, geralmente é preferível usar caminhos relativos. No entanto, se a localização do arquivo de origem não for alterada, mas a localização do link simbólico for provável de ser alterada, seria preferível usar um caminho absoluto:

~/playground$ cd anotherplace 
~/playground/anotherplace$ ln -s ../elsewhere/sauce target-rel
~/playground/anotherplace$ ln -s /home/zanna/playground/elsewhere/sauce target-abs
~/playground/anotherplace$ cd ..
~/playground$ mv anotherplace ..
~/playground$ cd ..
~$ file anotherplace/*
anotherplace/target-abs: symbolic link to /home/zanna/playground/elsewhere/sauce
anotherplace/target-rel: broken symbolic link to ../elsewhere/sauce
    
por Zanna 11.01.2018 / 15:15
3

Links simbólicos não precisam de caminhos absolutos. Funciona muito bem com caminhos relativos:

$ ls -l /usr/bin/X11
lrwxrwxrwx 1 root root 1 May 11  2017 /usr/bin/X11 -> .

Veja, aqui está um link simbólico para um caminho relativo, que funciona perfeitamente:

$ realpath /usr/bin/X11/yes
/usr/bin/yes
$ file /usr/bin/X11/yes
/usr/bin/X11/yes: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=add2c9ee02a98b5066d08d5ba2e79697880b2662, stripped
    
por muru 10.01.2018 / 05:46