ln -s com um caminho relativo ao pwd

22

Estou tentando criar vários links simbólicos, mas não consigo entender por que isso está funcionando

ln -s /Users/niels/something/foo ~/bin/foo_link

enquanto isso

cd /Users/niels/something
ln -s foo ~/bin/foo_link

não é.

Acredito que tenha algo a ver com foo_link vinculando a foo em /Users/niels/bin em vez de /Users/niels/something

Então a questão é, como criar um link simbólico que aponte para um caminho absoluto, sem realmente digitá-lo?

Para referência, estou usando o Mac OS X 10.9 e o Zsh.

    
por Niels B. 17.04.2014 / 00:30

3 respostas

28

A maneira mais fácil de se vincular ao diretório atual como um caminho absoluto, sem digitar a string do caminho inteiro, seria

ln -s "$(pwd)/foo" ~/bin/foo_link

O argumento target (primeiro) para o comando ln -s funciona em relação à localização do link simbólico, não ao seu diretório atual. Isso ajuda a saber que, essencialmente, o link simbólico criado (o segundo argumento) simplesmente contém o texto que você fornece para o primeiro argumento.

Portanto, se você fizer o seguinte:

cd some_directory
ln -s foo foo_link

e mova esse link em torno de

mv foo_link ../some_other_directory
ls -l ../some_other_directory

você verá que foo_link tenta apontar para foo no diretório em que está residindo. Isso também funciona com links simbólicos apontando para caminhos relativos. Se você fizer o seguinte:

ln -s ../foo yet_another_link

e, em seguida, mova yet_another_link para outro diretório e verifique para onde aponta, você verá que ele sempre aponta para ../foo . Esse é o comportamento pretendido, pois muitas vezes os links simbólicos podem fazer parte de uma estrutura de diretório que pode residir em vários caminhos absolutos.

No seu caso, quando você cria o link digitando

ln -s foo ~/bin/foo_link

foo_link apenas contém um link para foo , relativo à sua localização. Colocar $(pwd) na frente do nome do argumento de destino simplesmente adiciona o caminho absoluto do diretório de trabalho atual, para que o link seja criado com um destino absoluto.

    
por 17.04.2014 / 01:04
4

Usar o sinalizador -r ( --relative ) fará isso funcionar:

ln -sr foo ~/bin/foo_link
    
por 16.02.2016 / 00:55
0

Que tal:

 $ cd /Users/niels/something
 $ ln -s ./foo ~/bin/foo_link
    
por 17.04.2014 / 00:58