2009-01-20 1 views
4

Я думаю, что этот вопрос довольно прост для вас, монстров, скриптовых монстров.Сценарий Bash для создания символических ссылок на разделяемые библиотеки

Я ищу самый элегантный и самый короткий способ создания символических ссылок на разделяемые библиотеки для Unix с помощью сценария оболочки bash.

Что мне нужно будет начинать с список общих файлов библиотек, таких как «libmythings.so.1.1, libotherthings.so.5.11», получить символические ссылки созданы такие как:

libmythings.so -> libmythings.so.1 -> libmythings.so.1.1 
libotherthings.so -> libotherthings.so.5 -> libotherthings.so.5.11 

библиотеке файлы находятся внутри каталога, который содержит другие файлы, такие как другие сценарии оболочки.

EDIT: Ну, "ldconfig -nN." может работать нормально, но мне также нужна ссылка без основного номера библиотеки, добавленного после «.so», по крайней мере, одной из библиотек, поскольку одна или несколько библиотек являются точками ввода вызовов JNI с Java, поэтому, когда библиотека с помощью System.loadlibrary ("libraryname"), он ожидает библиотеку с именем "libraryname.so", а не "libraryname.so.X".

Решение с помощью только ldconfig -nN могло бы работать, если бы возникло обходное решение для части Java.

ответ

5
for baselib in "[email protected]" 
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 

Я обманут - все ссылки идут на базовую библиотеку (libmythings.so.1.1), если вы действительно хотите цепи, то вам необходимо:

for baselib in "[email protected]" 
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   

Осторожно -. непроверенный код


Hubris предшествует Немезида

Комментарий пришел, что приведенный выше код. не работает - и комментарий правильный. Исправленная версия с проверкой на месте является:

set -- libname.so.5.1.1 

for baselib in "[email protected]" 
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 

Изменения в команде sed. Эта версия ничего не печатает по умолчанию (-n), соответствует только строкам, заканчивающимся точкой, за которой следуют цифры, а затем удаляет все, кроме этого суффикса, и печатает то, что осталось для присвоения extn. С поправками сценарий генерирует результат ниже. Удалите эхо, чтобы заставить его выполнить команды связи.

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 

Скрипт иллюстрирует интересный и часто упускаются из вида пункта о сценариях оболочки: последовательность операций в состоянии блока некоторого времени не должна быть одной командой. Состояние строки с помощью операции редактирования не влияет на успешность теста в целом; статус выхода последней команды, «[ -n "$extn" ]», контролирует, продолжается ли цикл.

+0

Это не работает :-(Но спасибо за попытку. –

+0

У вас есть правильный ответ, хотя я уже сделал это сам с помощью команды «cut». –

11

Я считаю, что ldconfig является стандартным инструментом, который делает это.

Я помню, где-то он может генерировать символические ссылки на основе внутренней информации о версии, но не может найти источник прямо сейчас.

EDIT Да, если вы запустите

ldconfig -v 

Вы увидите, что генерируя все ссылки на основе библиотеки внутренностей.

ldconfig /path/to/dir 

Создаст только ссылки на файлы в этой директории

записку, хотя, я играл с ним, и он не кажется, последовательно создавать .so $, просто .so. {} Основных

Я не уверен, как работают его внутренние органы, но я знаю:

 
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) 

Так что определяет, как это работает для меня загадка

Редактировать После получения дополнительной информации, файлы .la не влияют на поведение.

Поле «SO» указывает, на что будет вызываться символьная ссылка.

И будет только один.

0x000000000000000e (игнорирован) Библиотека игнорирован: [libmagix.so]

Это после взлома кода и замена».1" с пробелами.

ldconfig generated »libmagic.так "(да, включая пробелы)

+2

"LDCONFIG -nn." просто отлично работает для текущего каталога, но он создает только основную версию библиотеки (libmylib.1 -> libmylib.1.10). –

3

Полученный из сценария от Джонатана Леффлера (я добавил это как сценарий под названием 'liblinks' в моем ~/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