Resolviendo enlaces simbólicos (pwd)

32

Digamos que hago lo siguiente:

cd /some/path
ln -s /target/path symbolic_name

Si entonces hacer:

cd /some/path
cd symbolic_name
pwd

Yo obtengo:

/some/path/symblic_name

y no:

/target/path

¿Hay alguna manera de que el shell "resuelva completamente" un enlace simbólico (es decir, actualizar CWD, etc.), como si lo hubiera hecho directamente:

cd /target/path

?

Necesito ejecutar algunos programas que parecen ser "conscientes" o "sensibles" acerca de cómo llego a mi ruta de destino, y me gustaría que piensen que llegué a la ruta de destino como si lo hubiera hecho cd /target/pathdirectamente.

Amelio Vazquez-Reina
fuente
77
Relacionado con esta pregunta . Puede hacer pwd -Po alias pwd='pwd -P'también cd -Pir a la ruta física en lugar del enlace simbólico.
Martín Canaval
@ MartínCanaval Gracias; eso es lo que estaba buscando!
Ryan

Respuestas:

35

Su caparazón tiene un incorporado pwd, que trata de ser "inteligente". Después de cdhacer un enlace simbólico, el interno pwdfalsifica la salida como si se hubiera movido a un directorio real.

Pase la -Popción a pwd, es decir, ejecutar pwd -P. La -Popción (para "físico") le dice que pwdno haga ningún seguimiento simbólico de enlaces y que muestre la ruta "real" al directorio.

Alternativamente, también debería haber un binario real pwd, que no hace (e incluso no puede hacer) este tipo de magia. Solo usa esa explicidad binaria:

$ type -a pwd
pwd is a shell builtin
pwd is /bin/pwd
$ mkdir a
$ ln -s a b
$ cd b
$ pwd
/home/michas/b
$ /bin/pwd
/home/michas/a
michas
fuente
12

Tratar cd -P <symlink_dirname>.

tim@ls:~$ mkdir a
tim@ls:~$ ln -s a b

tim@ls:~$ cd b
tim@ls:~/b$ pwd
/home/tim/b

tim@ls:~/b$ cd ..
tim@ls:~$ cd -P b
tim@ls:~/a$ pwd
/home/tim/a

También puede usar set -o physicalpara hacer que este comportamiento persista durante la vida útil del shell en ejecución.

Echa un vistazo a https://stackoverflow.com/questions/10456784/behavior-of-cd-bash-on-symbolic-links para obtener más información.

livingstaccato
fuente