liga - listar enlaces simbolicos linux
Script Bash para crear enlaces simbólicos a bibliotecas compartidas (3)
Creo que ldconfig
es la herramienta estándar que hace esto.
Recuerdo que en algún lugar puede generar enlaces simbólicos basados en la información de la versión interna, pero no puede encontrar la fuente en este momento.
EDITAR Sí, si ejecuta
ldconfig -v
Lo verá generando todos los enlaces basados en las partes internas de la biblioteca.
ldconfig /path/to/dir
Solo creará enlaces para archivos en ese directorio
Sin embargo, una nota, jugué con ella y no parece crear consistentemente .so $, solo .so. {Major}
No estoy seguro de cómo funciona su funcionamiento interno, pero sí sé:
lib # rm libmagic.so lib # rm libmagic.so.1 lib # ldconfig lib # file libmagic.so.1 libmagic.so.1: symbolic link to `libmagic.so.1.0.0'' lib # file libmagic.so libmagic.so: cannot open `libmagic.so'' (No such file or directory)
Entonces, qué es lo que determina cómo funciona esto es un misterio para mí
Editar tras otra discusión, los archivos .la no tienen influencia en el comportamiento.
El campo de nombre "SO" indica cómo se llamará el enlace simbólico.
Y solo habrá uno.
0x000000000000000e (SONAME) Library soname: [libmagix.so]
Esto es después de piratear el código y reemplazar el ".1" con espacios.
ldconfig generó "libmagic.so" (sí, espacios incluidos)
Creo que esta pregunta es bastante fácil para los monstruos de scripts de shell.
Estoy buscando la manera más elegante y más corta de crear enlaces simbólicos a bibliotecas compartidas para Unix por medio de un script bash shell.
Lo que necesito es comenzar con una lista de archivos de bibliotecas compartidas, como "libmythings.so.1.1, libotherthings.so.5.11", obtener los enlaces simbólicos creados, tales como:
libmythings.so -> libmythings.so.1 -> libmythings.so.1.1
libotherthings.so -> libotherthings.so.5 -> libotherthings.so.5.11
Los archivos de la biblioteca se encuentran dentro de un directorio que contiene otros archivos, como otros scripts de shell.
EDITAR : Bueno, "ldconfig -nN". podría funcionar bien, pero también necesito el enlace sin el número principal de la biblioteca adjunta después de ".so", al menos una de las bibliotecas, ya que una o más bibliotecas son los puntos de entrada de las llamadas JNI desde Java, por lo que cuando una biblioteca se instancia por medio de System.loadlibrary ("nombre de biblioteca") espera una biblioteca llamada "nombre de biblioteca.so", no "nombre de biblioteca.so.X".
La solución con solo ldconfig -nN podría funcionar si hubiera una solución para la parte de Java.
for baselib in "$@"
do
shortlib=$baselib
while extn=$(echo $shortlib | sed ''s//.[0-9][0-9]*$//'')
[ -n "$extn" ]
do
shortlib=$(basename $shortlib $extn)
ln -s $baselib $shortlib
done
done
He hecho trampa: todos los enlaces van a la biblioteca base (libmythings.so.1.1); si realmente quieres encadenar, entonces necesitas:
for baselib in "$@"
do
shortlib=$baselib
while extn=$(echo $shortlib | sed ''s//.[0-9][0-9]*$//'')
[ -n "$extn" ]
do
shorterlib=$(basename $shortlib $extn)
ln -s $shortlib $shorterlib
shortlib=$shorterlib
done
done
Cuidado: código no probado.
Hubris precede a Némesis.
Se recibió el comentario de que el código anterior no funciona, y el comentario es correcto. Una versión fija con prueba in situ es:
set -- libname.so.5.1.1
for baselib in "$@"
do
shortlib=$baselib
while extn=$(echo $shortlib | sed -n ''//.[0-9][0-9]*$/s/.*/(/.[0-9][0-9]*/)$//1/p'')
[ -n "$extn" ]
do
shortlib=$(basename $shortlib $extn)
echo ln -s $baselib $shortlib
done
done
El cambio está en el comando sed
. Esta versión no imprime nada por defecto ( -n
), solo coincide con las líneas que terminan con un punto seguido de dígitos, y luego borra todo excepto ese sufijo, e imprime lo que queda para la asignación a extn. Según se enmendó, el script genera el resultado a continuación. Elimina el eco para que ejecute los comandos de enlace.
ln -s libname.so.5.1.1 libname.so.5.1
ln -s libname.so.5.1.1 libname.so.5
ln -s libname.so.5.1.1 libname.so
La secuencia de comandos ilustra un punto interesante y con frecuencia pasado por alto sobre los scripts de shell: la secuencia de operaciones en el bloque de condiciones de un tiempo no necesita ser un solo comando. El estado de la línea con la operación de edición no afecta si la prueba como un todo tiene éxito; el estado de salida del último comando, '' [ -n "$extn" ]
'', controla si el ciclo continúa.
Derivado del guión de Jonathan Leffler (lo he agregado como guión llamado ''liblinks'' en mi ~ / bin)
#!/bin/bash
# liblinks - generate symbolic links
# given libx.so.0.0.0 this would generate links for libx.so.0.0, libx.so.0, libx.so
#
# By adding sudo to the ls command, we get permission to do the linking (or get an empty list)
LIBFILES=`sudo ls lib*.so.*`
for FILE in $LIBFILES;
do
echo $FILE
shortlib=$FILE
basename=$FILE
while extn=$(echo $shortlib | sed -n ''//.[0-9][0-9]*$/s/.*/(/.[0-9][0-9]*/)$//1/p'')
[ -n "$extn" ]
do
shortlib=$(basename $shortlib $extn)
sudo ln -fs $basename $shortlib
basename=$shortlib
done
done