Estou tentando criar um monte de links simbólicos, mas não consigo descobrir por que isso está funcionando
ln -s /Users/niels/something/foo ~/bin/foo_link
enquanto este
cd /Users/niels/something ln -s foo ~/bin/foo_link
não é.
Acredito que tenha algo a ver com foo_link
vincular a foo em /Users/niels/bin
em vez de /Users/niels/something
Portanto, a questão é: como faço para criar um link simbólico que aponta para um caminho absoluto, sem realmente digitá-lo?
Para referência, estou usando Mac OS X 10.9 e Zsh .
Resposta
A maneira mais fácil de vincular ao diretório atual como um caminho absoluto, sem digitar toda a string do caminho, seria
ln -s "$(pwd)/foo" ~/bin/foo_link
O target
(primeiro) argumento para o ln -s
comando funciona em relação à localização do link simbólico, não ao seu diretório atual. Ajuda saber que, essencialmente, o creat ed symlink (o segundo argumento) simplesmente contém o texto fornecido para o primeiro argumento.
Portanto, se você fizer o seguinte:
cd some_directory ln -s foo foo_link
e, em seguida, mova esse link
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 reside. 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, mover yet_another_link
para outro diretório e verificar para onde ele aponta, você verá que ele sempre aponta para ../foo
. Esse é o comportamento pretendido, já que 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, ao criar 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 diretório de trabalho atual “s caminho absoluto, para que o link seja criado com um destino absoluto.
Comentários
Resposta
Usando o -r
(--relative
) a sinalização fará com que isso funcione:
ln -sr foo ~/bin/foo_link
Comentários
- Esteja ciente de que
-r
é um GNUismo, ou seja, não POSIX, portanto não ' funcionará no caso OP como o OS X padrãoln
comando é baseado em BSD.
Resposta
Para salvar alguns digitando, você pode fazer
ln -s "$PWD"/foo ~/bin/foo_link
Comentários
- @Freddy, depende do shell. Em fish ou zsh, estaria tudo bem.Em shells tipo Bourne incluindo bash e com o valor padrão de $ IFS, SPC seria realmente um problema, mas também TAB, NL e todos os caracteres globbing (pelo menos
*
,?
e[...]
). - @St é phaneChazelas Sim, você ' está certo e a pergunta está marcada com
bash
, então ' é geralmente um boa ideia citá-lo. Que pena, eu deveria ter sido mais específico.
Resposta
Que tal:
$ cd /Users/niels/something $ ln -s ./foo ~/bin/foo_link
Comentários
- Não, não ' não resolve.
source_file
(primeiro) argumento é para onde o link aponta, que é literalmente o que você insere no comando. O argumentotarget_file
(segundo) torna-se o nome do link, a menos que o que você insira seja um diretório, caso em que o nome do link é o mesmo que o nome de base dosource_file
mas colocado no diretóriotarget_file
.ln
,target
é o primeiro argumento (onde o link aponta para ) enquanto o segundo argumento é simplesmente referido comolink
(source
não é mencionado).target
e o segundolink
( man7.org/ linux / man-pages / man1 / ln.1.html ). Mas no BSD (incluindo OS X), o primeiro é denominadosource
e o segundotarget
( freebsd.org/cgi/man.cgi?ln ). Muito confuso.