как управлять несколькими библиотеками в одной системе Linux? [закрыто]

Вы можете попробовать это с помощью awk. Он выведет номер строки в случае совпадения.

$ awk  '/^\|/ || /\|\|/ || /\|$/{print $0}' input_test 
apple|banana|pear||grapefruit
|tangerine|nectarine|plum
apricot|orange|pineapple|coconut|

Основываясь на ваших изменениях к первоначальному вопросу, я переработал команду awk.

Объяснение: Awk будет соответствовать одному из трех условий

  • /\|\|/ будет соответствовать любому нулевому полю, которое не является первым или последним.
  • /^\|/ будет соответствовать любому нулевому полю в начале строки - "^".
  • /\|$/ будет соответствовать любому нулевому полю в конце строки - "$".

Поскольку awk распознает | как оператор, когда мы пытаемся найти соответствие "|", мы должны использовать "\" перед ним.

Теперь эти 3 условия объединяются вместе с "||", что awk интерпретирует как "or". Когда одно из этих трех условий будет выполнено, будет напечатана вся строка.

Чтобы определить нулевой столбец (столбцы), можно использовать

awk -F"|" '!length($1) || !length($4) {print $0} ' input_test
2
16.04.2017, 06:25
1 ответ

Если ваша библиотека правильно определяет свое сонам, вы можете без проблем установить несколько версий. Например, в настоящее время у меня установлены три версии libreadline:

$ ls -l /lib/x86_64-linux-gnu/libreadline.so.*
lrwxrwxrwx 1 root root     18 Dec  4  2015 /lib/x86_64-linux-gnu/libreadline.so.5 -> libreadline.so.5.2
-rw-r--r-- 1 root root 263352 Dec  4  2015 /lib/x86_64-linux-gnu/libreadline.so.5.2
lrwxrwxrwx 1 root root     18 Oct  4  2016 /lib/x86_64-linux-gnu/libreadline.so.6 -> libreadline.so.6.3
-rw-r--r-- 1 root root 296792 Oct  4  2016 /lib/x86_64-linux-gnu/libreadline.so.6.3
lrwxrwxrwx 1 root root     18 Jan 24 16:17 /lib/x86_64-linux-gnu/libreadline.so.7 -> libreadline.so.7.0
-rw-r--r-- 1 root root 309168 Jan 24 16:17 /lib/x86_64-linux-gnu/libreadline.so.7.0

Это работает, потому что программы ссылаются на soname, поэтому все, что создано для версии 5, ссылается на libreadline.so.5, все, что создано для версии 6, ссылается на libreadline.so.6 и т. д.Требование со стороны библиотеки состоит в том, что все версии с одним и тем же именем soname должны сохранять свой ABI: новые версии могут добавлять функции, но они не могут нарушать существующие функции. Любое критическое изменение подразумевает изменение сонейма.

Если все это сделано правильно (на стороне библиотеки), вам никогда не понадобится несколько версий библиотеки с одним и тем же именем soname: пока у вас есть последняя версия, вы будете иметь возможность запускать любое программное обеспечение, созданное для любой версии библиотеки с тем же именем soname. Продолжая пример libreadline, программное обеспечение, созданное с помощью библиотеки версии 5.1, прекрасно работает с версией 5.2. (Обратное не обязательно верно; программы, использующие новые функции версии 5.2, не будут работать с версией 5.1.)

Возможно, стоит заглянуть в libtool (да, я знаю), если вы не уже использует его: у него есть разумно используемая схема управления версиями, которая обрабатывает неровности сонимов.

Некоторые библиотеки идут на крайние меры, чтобы свести к минимуму необходимость в использовании сонимов; библиотека GNU C является примером, она широко использует управление версиями символов, чтобы избежать нарушения ABI, в то же время добавляя новые функции и обратно несовместимые изменения (она просто сохраняет старые версии, внутри библиотеки).

3
27.01.2020, 22:10

Теги

Похожие вопросы