ln -s con una ruta relativa a pwd

26

Estoy tratando de crear un montón de enlaces simbólicos, pero no puedo entender por qué esto está funcionando

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

mientras esto

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

no es.

Creo que tiene algo que ver con foo_linkvincular a foo en /Users/niels/binlugar de/Users/niels/something

Entonces, la pregunta es, ¿cómo creo un enlace simbólico que apunte a una ruta absoluta, sin escribirla realmente?

Como referencia, estoy usando Mac OS X 10.9 y Zsh.

Niels B.
fuente

Respuestas:

33

La forma más fácil de vincular al directorio actual como una ruta absoluta, sin escribir la cadena de ruta completa sería

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

El target(primer) argumento para el ln -scomando funciona en relación con la ubicación del enlace simbólico, no con su directorio actual. Es útil saber que, esencialmente, el enlace simbólico creado (el segundo argumento) simplemente contiene el texto que proporciona para el primer argumento.

Por lo tanto, si haces lo siguiente:

cd some_directory
ln -s foo foo_link

y luego mover ese enlace

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

verá que foo_link intenta señalar fooen el directorio en el que reside. Esto también funciona con enlaces simbólicos que apuntan a rutas relativas. Si haces lo siguiente:

ln -s ../foo yet_another_link

y luego pasar yet_another_linka otro directorio y verificar hacia dónde apunta, verá que siempre apunta ../foo. Este es el comportamiento previsto, ya que muchas veces los enlaces simbólicos pueden ser parte de una estructura de directorio que puede residir en varias rutas absolutas.

En su caso, cuando cree el enlace escribiendo

ln -s foo ~/bin/foo_link

foo_linksolo tiene un enlace a foo, relativo a su ubicación. Poner $(pwd)delante del nombre del argumento objetivo simplemente agrega la ruta absoluta del directorio de trabajo actual, de modo que el enlace se crea con un objetivo absoluto.

Achilleas
fuente
"... ayuda a imaginar que el enlace simbólico creado simplemente contiene texto ..." ¿No es esta la verdad literal?
Comodín
1
Es. Quizás podría cambiar imaginar para "saber" o "entender".
Achilleas
Quizás me he confundido (otra vez). Parece que cuando dices "objetivo" te refieres a "fuente". El source_file(primer) argumento es donde apunta el enlace, que es literalmente lo que ingresa en el comando. El target_file(segundo) argumento se convierte en el nombre del enlace a menos que lo que ingrese sea un directorio, en cuyo caso el nombre del enlace es el mismo que el nombre base del source_filepero colocado en el directorio target_file.
Charlie Gorichanaz
Tienes razón, ̶ HAY un error en la RESPUESTA crAzY cómo estas no se pillan ̶s̶o̶o̶n̶e̶r̶.̶ ̶F̶i̶x̶i̶n̶g̶.̶ No, la respuesta era correcta. Por la lnpágina de manual, targetes el primer argumento (donde los puntos de enlace a ), mientras que el segundo argumento es simplemente denominado como el link( sourceno se menciona).
Achilleas
3
En linux (gnu ln) la página man llama al primer argumento targety al segundo link( man7.org/linux/man-pages/man1/ln.1.html ). Pero en BSD (incluido OS X) se llama al primero sourcey al segundo target( freebsd.org/cgi/man.cgi?ln ). Bastante confuso.
cristoper
5

Usar la bandera -r( --relative) hará que esto funcione:

ln -sr foo ~/bin/foo_link
Geremia
fuente
44
Tenga en cuenta que -res un GNUism, es decir, no POSIX, por lo que no funcionará en el caso de OP ya que el lncomando estándar de OS X está basado en BSD.
jlliagre
2

Para guardar algo de mecanografía, puedes hacer

ln -s "$PWD"/foo ~/bin/foo_link
coseno
fuente
@ Freddy, depende del caparazón. En fish o zsh, estaría bien. En los shells tipo Bourne, incluyendo bash y con el valor predeterminado de $ IFS, SPC sería un problema, pero también TAB, NL y todos los caracteres globales (al menos *, ?y [...]).
Stéphane Chazelas
@ StéphaneChazelas Sí, tienes razón y la pregunta está etiquetada bash, por lo que generalmente es una buena idea citarla. Lo malo, debería haber sido más específico.
Freddy
0

Qué tal si:

 $ cd /Users/niels/something
 $ ln -s ./foo ~/bin/foo_link
ptierno
fuente
1
No, no hace el truco.
Niels B.