ln -s com um caminho relativo a pwd

26

Estou tentando criar um monte de 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 é.

Eu acredito que tem algo a ver com foo_linkvincular a foo em /Users/niels/binvez de/Users/niels/something

Portanto, a pergunta é: 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.

Niels B.
fonte

Respostas:

33

A maneira mais fácil de vincular ao diretório atual como um caminho absoluto, sem digitar toda a cadeia de caminho, seria

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

O target(primeiro) argumento para o ln -scomando funciona em relação à localização do link simbólico, não ao diretório atual. Ajuda saber que, essencialmente, o link simbólico criado (o segundo argumento) simplesmente reté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 depois mova esse link

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

você verá que foo_link tenta apontar para fooo diretório em que reside. Isso também funciona com links simbólicos que apontam para caminhos relativos. Se você fizer o seguinte:

ln -s ../foo yet_another_link

e depois vá yet_another_linkpara outro diretório e verifique para onde ele 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órios que pode residir em vários caminhos absolutos.

No seu caso, quando você cria o link, digitando

ln -s foo ~/bin/foo_link

foo_linkapenas manté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.

Achilleas
fonte
"... ajuda a imaginar que o link simbólico criado simplesmente contém texto ..." Não é essa a verdade literal?
Curinga
1
Isto é. Talvez eu pudesse mudar, imagine "saber" ou "entender".
Achilleas
Talvez eu tenha me confundido (de novo). Parece que quando você diz "alvo", você quer dizer "fonte". O source_file(primeiro) argumento é onde o link aponta, que é literalmente o que você digita no comando. O target_file(segundo) argumento se torna o nome do link, a menos que você insira um diretório; nesse caso, o nome do link é o mesmo que o nome da base, source_filemas colocado no diretório target_file.
Charlie Gorichanaz
Você está certo, ̶ Há's um erro na ̶a̶n̶s̶w̶e̶r̶.̶ louco como ele Não sofreu pego ̶s̶o̶o̶n̶e̶r̶.̶ ̶F̶i̶x̶i̶n̶g̶.̶ Não, a resposta estava certa. Pela lnpágina de manual, targeté o primeiro argumento (onde o link aponta para ), enquanto o segundo argumento é simplesmente referido como o link( sourcenão é mencionado).
Achilleas
3
No linux (gnu ln), a página do manual chama o primeiro argumento targete o segundo link( man7.org/linux/man-pages/man1/ln.1.html ). Mas no BSD (incluindo OS X) o primeiro é chamado sourcee o segundo target( freebsd.org/cgi/man.cgi?ln ). Bastante confuso.
Cristoper
5

Usar o sinalizador -r( --relative) fará este trabalho:

ln -sr foo ~/bin/foo_link
Geremia
fonte
4
Cuidado que -ré um GNUism, ou seja, não POSIX, portanto não funcionará no caso OP, pois o lncomando padrão do OS X é baseado em BSD.
Jlliagre
2

Para salvar algumas digitações, você pode fazer

ln -s "$PWD"/foo ~/bin/foo_link
cosseno
fonte
@ Fred, isso depende do shell. Em peixe ou zsh, seria bom. Em shells tipo Bourne, incluindo bash e com o valor padrão de $ IFS, o SPC seria realmente um problema, mas também TAB, NL e todos os caracteres brilhantes (pelo menos *, ?e [...]).
Stéphane Chazelas 03/09
@ StéphaneChazelas Sim, você está certo e a pergunta está marcada bash, por isso é geralmente uma boa ideia citá-la. Meu mal, eu deveria ter sido mais específico.
Freddy
0

E se:

 $ cd /Users/niels/something
 $ ln -s ./foo ~/bin/foo_link
ptierno
fonte
1
Não, não faz o truque.
Niels B.