Crear un enlace simbólico absoluto al directorio actual

12

Ahora estoy bajo un directorio con una ruta muy larga. Para futuras visitas más rápidas, me gustaría crear un enlace.

Lo intenté

ln -s . ~/mylink

~/mylinken realidad enlaces a ~. Entonces, ¿puedo expandirme ~al nombre de ruta obscuro y luego dárselo ln?

Tim
fuente

Respuestas:

19

Un enlace simbólico en realidad almacena la ruta que das literalmente, como una cadena¹. Eso significa que su enlace ~/mylinkcontiene " ." (un carácter). Cuando accede al enlace, esa ruta se interpreta en relación con el lugar del enlace, en lugar de donde estaba cuando creó el enlace.

En cambio, puede almacenar la ruta real que desea en el enlace:

ln -s "$(pwd)" ~/mylink

usando la sustitución de comandos para poner la salida de pwd(el nombre del directorio de trabajo) en su línea de comando. lnve la ruta completa y la almacena en su enlace simbólico, que luego apuntará al lugar correcto.

¹ Más o menos.

Michael Homer
fuente
2
Ver también "$PWD"en shells POSIX y ~0en zsh.
Stéphane Chazelas
7

Deberías usar:

ln -s "$(cd . && pwd)" ~/mylink

o:

ln -s "$(pwd -P)" ~/mylink

para obtener el resultado correcto para el directorio de trabajo actual. Se puede cambiar mientras trabajaba en él como en esta pregunta .

Cuonglm
fuente
1
El primero no necesariamente ayudará en todos los shells (ver esta respuesta ). El OP probablemente quiera usar $PWD(la ruta que usó para llegar allí), en lugar de $(pwd -P)(la ruta canónica al directorio actual). Si $PWDya no apunta al directorio actual, tampoco se puede decir eso $(pwd -P)en el próximo minuto.
Stéphane Chazelas
@ StéphaneChazelas: Vea esto unix.stackexchange.com/questions/147693/…
cuonglm
@ StéphaneChazelas: Puede ver que "$PWD"todavía tiene el valor anterior si se mueve el directorio actual. PWDsolo se establece cuando usted cdo se inicializa por el shell.
Cuonglm 01 de
Pero lo que digo es que es probable que el OP quiera el viejo $ PWD que alguna ruta absoluta al directorio de trabajo actual y que en varios shells (ksh93, ash, yash), como se explica allí,cd no se garantiza que las llamadas se realicen $ PWD o la salida de pwd una ruta al directorio actual. Estás tratando de protegerte contra algo que no es probable que suceda, pero en la primera solución, eso no es necesariamente efectivo, y en la segunda, eso está cambiando el comportamiento.
Stéphane Chazelas
1
Si alguien hace la mv tras lo hace ln, entonces termina en la misma situación. Por otro lado, si lo hizo cd /long/logical/path/to/some/directory, no desea que el enlace apunte a /vg0/lv1/user2/app4(la ruta canónica) ya que el enlace apuntará al lugar incorrecto cuando /long/logical/path/to/some/directoryapunte a otro lugar.
Stéphane Chazelas