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
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.
source_file
(primer) argumento es donde apunta el enlace, que es textualmente lo que ingresa en el comando. Eltarget_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 delsource_file
pero colocado en el directoriotarget_file
.ln
,target
es el primer argumento (donde el enlace apunta a ) mientras que el segundo argumento se denomina simplementelink
(source
no se menciona).target
y al segundolink
( man7.org/ linux / man-pages / man1 / ln.1.html ). Pero en BSD (incluido OS X), el primero se llamasource
y el segundotarget
( freebsd.org/cgi/man.cgi?ln ). Bastante confuso.