ln -s con una ruta relativa a pwd

Estoy tratando de crear un montón de enlaces simbólicos, pero no puedo entender por qué funciona.

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

mientras que este

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

no lo es.

Creo que tiene algo que ver con foo_link enlazar a foo en /Users/niels/bin en lugar de /Users/niels/something

Entonces la pregunta es, ¿cómo puedo crear un enlace simbólico que apunte a una ruta absoluta, sin tener que escribirlo?

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

Respuesta

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

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

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

Por lo tanto, si haces lo siguiente:

cd some_directory ln -s foo foo_link 

y luego mueva ese enlace

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

verá que foo_link intenta apuntar a foo en el directorio en el que reside. Esto también funciona con enlaces simbólicos que apuntan a rutas relativas. Si hace lo siguiente:

ln -s ../foo yet_another_link 

y luego mueve yet_another_link a otro directorio y verifica a dónde apunta, Verá que siempre apunta a ../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 crea el enlace escribiendo

ln -s foo ~/bin/foo_link 

foo_link solo contiene un enlace a foo, relativo a su ubicación. Poner $(pwd) delante del nombre del argumento de destino simplemente agrega el directorio de trabajo actual «s ruta absoluta, de modo que el vínculo se cree con un objetivo absoluto.

Comentarios

  • " … ayuda a imaginar que el enlace simbólico creado simplemente contiene texto …. " Isn ' ¿No es esta la verdad literal?
  • Lo es. Quizás podría cambiar imagine a " know " o " entiendo ".
  • Quizás me he confundido (de nuevo). Parece que cuando dices " target " te refieres a " source ". El source_file (primer) argumento es donde apunta el enlace, que es textualmente lo que ingresa en el comando. El target_file (segundo) argumento se convierte en el nombre del enlace a menos que ingrese un directorio, en cuyo caso el nombre del enlace es el mismo que el nombre base del source_file pero colocado en el directorio target_file.
  • Y̶o̶u̶ ' ̶r̶e̶ ̶r̶i̶g̶h̶t̶, ̶ ̶ ̶h̶e̶r̶ ' s un error en la rESPUESTA locura lo didn ' dejan atrapar ̶s̶o̶o̶n̶e̶r̶.̶ ̶F̶i̶x̶i̶n̶g̶.̶ No, la respuesta fue derecho. En la página de manual de ln, target es el primer argumento (donde el enlace apunta a ) mientras que el segundo argumento se denomina simplemente link (source no se menciona).
  • En linux (gnu ln), La página de manual llama al primer argumento target y al segundo link ( man7.org/ linux / man-pages / man1 / ln.1.html ). Pero en BSD (incluido OS X), el primero se llama source y el segundo target ( freebsd.org/cgi/man.cgi?ln ). Bastante confuso.

Responder

Usando el -r (--relative) hará que esto funcione:

ln -sr foo ~/bin/foo_link 

Comentarios

  • Tenga en cuenta que -r es un GNUismo, es decir, no POSIX, por lo que no ' no funcionará en el caso OP como OS X estándar div id = «8dceb49c5b»>

comando está basado en BSD.

Responder

Para guardar algunos escribiendo, puede hacer

ln -s "$PWD"/foo ~/bin/foo_link 

Comentarios

  • @Freddy, depende del shell. En fish o zsh, estaría bien.En shells similares a Bourne, incluido bash y con el valor predeterminado de $ IFS, SPC sería un problema, pero también TAB, NL y todos los caracteres globbing (al menos *, ? y [...]).
  • @St é phaneChazelas Sí, tú ' correcto y la pregunta está etiquetada con bash, por lo que ' es generalmente un buena idea citarlo. Mi mal, debería haber sido más específico.

Respuesta

¿Qué tal:

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

Comentarios

  • No, no ' no hace el truco.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *