
Instalé una aplicación Ruby /home/anp/tools
y luego creé un enlace simbólico de la siguiente manera:
ln -s /home/anp/tools/wwan /usr/bin/wwan
Si lo ejecuto ~/tools/wwan
, funciona perfectamente bien.
Si intento ejecutarlo desde el enlace simbólico, aparece un error que dice
no se puede cargar dicho archivo - lib/wwan
¿No debería funcionar esto como está? ¿El enlace simbólico está causando problemas cuando el programa intenta resolver rutas relativas de archivos?
Respuesta1
¿El enlace simbólico está causando problemas cuando el programa intenta resolver rutas relativas de archivos?
Puede. Lo más probable es que en este caso sea así.
Escenario plausible cuando ejecutas ~/tools/wwan
:
- El caparazón se expande
~
y realmente corres/home/anp/tools/wwan
. - La herramienta comienza. Sabe que lo es
/home/anp/tools/wwan
(por ejemplo, debido aargv[0]
). - La herramienta encuentra la parte del directorio de la cadena anterior y le cambia su propio directorio de trabajo:
/home/anp/tools/
. - La herramienta hace referencia a un activo adicional a través de una ruta relativa:
lib/wwan
. De hecho, el activo está en/home/anp/tools/lib/wwan
, por lo que funciona.
Pero cuando ejecuta /usr/bin/wwan
o wwan
(al /usr/bin
estar en $PATH
), el escenario comienza /usr/bin/wwan
y termina con /usr/bin/lib/wwan
un archivo que no existe. El activo no está ahí.
Los detalles pueden variar, pero un problema de este tipo con un enlace simbólico indica que la herramienta no elimina la referencia al enlace cuando debería. Si así fuera, siempre funcionaría /home/anp/tools/wwan
como si ejecutara /home/anp/tools/wwan
. Yo diría que lo que experimentaste es un error.
Una forma de solucionar esto es mejorar la propia herramienta (editar su código) para que encuentre correctamente su camino real.
Otra forma es utilizar un script contenedor en lugar de un enlace simbólico. Elimine el enlace simbólico y cree un script con el nombre /usr/bin/wwan
. El contenido del guión:
#!/bin/sh
exec /home/anp/tools/wwan "$@"
Hazlo ejecutable. Ahora, si llama /usr/bin/wwan
, el script lo hará exec
y /home/anp/tools/wwan
esta será la cadena con la que funcionará la herramienta, por lo que debería funcionar. Todos los argumentos (cero o más) que proporcione /usr/bin/wwan
se pasarán a /home/anp/tools/wwan
gracias a "$@"
.
Notas:
/usr/bin/
es una ubicación en todo el sistema para ejecutables. Enlazar desde allí a una herramienta que reside en su directorio personal no es una buena práctica en general; lo mismo para envolver.- Un script contenedor es un archivo normal independiente. Su propiedad y permisos son independientes de los del ejecutable de destino. Póngalos bien.