Respuestas:
Un enlace simbólico en realidad almacena la ruta que das literalmente, como una cadena¹. Eso significa que su enlace ~/mylink
contiene " .
" (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. ln
ve la ruta completa y la almacena en su enlace simbólico, que luego apuntará al lugar correcto.
¹ Más o menos.
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 .
$PWD
(la ruta que usó para llegar allí), en lugar de $(pwd -P)
(la ruta canónica al directorio actual). Si $PWD
ya no apunta al directorio actual, tampoco se puede decir eso $(pwd -P)
en el próximo minuto.
"$PWD"
todavía tiene el valor anterior si se mueve el directorio actual. PWD
solo se establece cuando usted cd
o se inicializa por el shell.
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.
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/directory
apunte a otro lugar.
"$PWD"
en shells POSIX y~0
enzsh
.