ln -s com um caminho relativo a pwd

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

  • " … ajuda a imaginar que o link simbólico criado simplesmente contém texto …. " Isn ' esta é a verdade literal?
  • É. Talvez eu pudesse mudar imagine para " know " ou " entenda ".
  • Talvez eu tenha me confundido (de novo). Parece que você diz " destino " você quer dizer " fonte ". O source_file (primeiro) argumento é para onde o link aponta, que é literalmente o que você insere no comando. O argumento target_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 do source_file mas colocado no diretório target_file.
  • Y̶o̶u̶ ' ̶r̶e̶ ̶r̶i̶g̶h̶t̶, ̶ ̶t̶h̶e̶r̶e̶e̶e ' s um erro na ̶a̶n̶s̶w̶e̶r̶.̶ louco como ele didn ' T pego ̶s̶o̶o̶n̶e̶r̶.̶ ̶F̶i̶x̶i̶n̶g̶.̶ Não, a resposta foi direita. Pela página de manual ln, target é o primeiro argumento (onde o link aponta para ) enquanto o segundo argumento é simplesmente referido como link (source não é mencionado).
  • No linux (gnu ln) o A página do manual chama o primeiro argumento target e o segundo link ( man7.org/ linux / man-pages / man1 / ln.1.html ). Mas no BSD (incluindo OS X), o primeiro é denominado source e o segundo target ( freebsd.org/cgi/man.cgi?ln ). Muito confuso.

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ão ln 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.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *