Cómo verificar el objetivo de un enlace simbólico apunta hacia una ruta particular

16

Dentro de un script bash, sé que puedo verificar si un archivo es un enlace simbólico con la siguiente sintaxis

if [ -L $path ]

¿Alguien sabe cómo probaría si esa ruta estaba vinculada a una ruta en particular? Por ejemplo, quiero verificar si el objetivo de $pathes /some/where.

BillMan
fuente
2
¿Te refieres a vinculado por un camino en particular? ¿No podrías hacer una readlinkruta conocida y compararla con la ruta que estás probando?
Bratchley
@Bratchley. Sí, a eso me refería ... gracias por la respuesta.
BillMan
2
Le recomiendo encarecidamente que ponga siempre las variables de shell entre comillas (por ejemplo if [ -L "$path" ]) , a menos que tenga una buena razón para no hacerlo y esté seguro de saber lo que está haciendo.
G-Man dice 'Reincorporar a Monica' el
@ G-Man gracias por los excelentes comentarios ... inconscientemente sé hacer eso, pero olvídalo en la práctica ... el refuerzo ayuda.
BillMan el

Respuestas:

22

Si desea verificar si $pathes un enlace simbólico cuyo objetivo es /some/where, puede usar la readlinkutilidad. No es POSIX, pero está disponible en muchos sistemas (GNU / Linux, BusyBox, * BSD, ...).

if [ "$(readlink -- "$path")" = /some/where ]; then 

Tenga en cuenta que esta es una comparación de texto exacta. Si el objetivo del enlace es /some//where, o si es wherey el valor de $pathes /some/link, entonces los textos no coincidirán.

Muchas versiones readlinkadmiten la opción -f, que canoniza la ruta al expandir todos los enlaces simbólicos.

Muchos shells, incluidos dash, ksh, bash y zsh, admiten al -efoperador en el testbuiltin para probar si dos archivos son iguales (enlaces duros al mismo archivo, después de seguir enlaces simbólicos). Esta característica también es ampliamente compatible pero no POSIX.

if [ "$path" -ef "/some/where" ]; then 
Gilles 'SO- deja de ser malvado'
fuente
el primer ejemplo no funciona cuando el enlace apunta a una ruta relativa ...
inemanja
1
@inemanja Claro que sí. Pero como afirmo, esta es una comparación de texto . Trata diferentes caminos hacia el mismo objetivo como diferentes. Si desea probar si el objetivo de un enlace simbólico es un archivo en particular , en lugar de una ruta en particular , use uno de los métodos que describo a continuación.
Gilles 'SO- deja de ser malvado'
0

Para evitar problemas con una ruta relativa y absoluta, y "/" al final de una ruta o enlace:

if [ "$(realpath $(readlink -- "$path"))" = $(realpath /some/where) ]; then
    echo "Is"
else 
    echo "Is not"
fi
inemanja
fuente
1
readlinkno parece ser necesario, realpathresolverá automáticamente el enlace simbólico.
Dagang