Рейтинг:3

Как найти пакет, предоставляющий псевдоним?

флаг bn

С использованием apt-файл Я могу найти пакеты, предоставляющие определенные исполняемые файлы, например:

sudo apt-file search {/bin,/sbin,/usr/bin/,/usr/sbin}/wget

А на самом деле:

sudo apt-file search {/bin,/sbin,/usr/bin/,/usr/sbin}/wget | grep "/wget$"

(Потому что в противном случае он просто вернул бы все пакеты, содержащие исполняемые файлы, начинающиеся с wget.)

Теперь я бежал:

EXEC_NAME="x86_64-w64-mingw32-g++"
sudo apt-file search {/bin,/sbin,/usr/bin/,/usr/sbin}/${EXEC_NAME} | grep "${EXEC_NAME}$"

И что удивительно, он ничего не возвращает. Почему? Потому что ни один пакет не предоставляет файл с таким именем.

Если я бегу:

EXEC_NAME="x86_64-w64-mingw32-g++"
sudo apt-file search {/bin,/sbin,/usr/bin/,/usr/sbin}/${EXEC_NAME}

Я получаю следующий результат:

g++-mingw-w64-x86-64-posix: /usr/bin/x86_64-w64-mingw32-g++-posix
g++-mingw-w64-x86-64-win32: /usr/bin/x86_64-w64-mingw32-g++-win32

подразумевая, что нет пакета, предоставляющего x86_64-w64-mingw32-g++.

Но через некоторое время я обнаружил, что g++-mingw-w64-x86-64-posix не просто предоставляет исполняемый файл g++-mingw-w64-x86-64-posix, но также псевдоним или символическая ссылка, называемая g++-mingw-w64-x86-64.

В данном случае это было легко понять, потому что в пакете оказался другой бинарник с очень похожим именем. Теперь моя проблема заключается в том, что мне нужно автоматизировать это таким образом, чтобы он работал для любого псевдонима/символической ссылки, даже для тех, которые имеют совершенно другое имя.

Как я могу это сделать?

Редактировать:

Псевдоним создается в файле g++-mingw-w64-x86-64-posix.postinst принадлежащий g++-mingw-w64-x86-64-posix пакет, если это поможет:

update-alternatives --install /usr/bin/x86_64-w64-mingw32-g++ x86_64-w64-mingw32-g++ /usr/bin/x86_64-w64-mingw32-g++-posix 30 \
  --slave /usr/bin/x86_64-w64-mingw32-c++ x86_64-w64-mingw32-c++ /usr/bin/x86_64-w64-mingw32-c++-posix

Редактировать2: Может быть, есть способ поиска содержимого файла всех пакетов? .postinst файлы? Может быть, скачав все .postinst файлы в кеш? Может быть, это можно сделать, сначала загрузив заголовок файла каждого пакета, чтобы увидеть, в каких байтах в архивах расположены файлы .postinst, а затем использовать HTTP-запросы диапазона для их загрузки?

Редактировать3:

Это ничего не меняет, но я обнаружил, что вместо grep и cut вы можете просто использовать -Икс и флаг. Это делает команду немного короче:

sudo apt-file search -l -x "^/(bin|sbin|usr/bin|usr/sbin)/${EXEC_NAME}$" | голова -1
mook765 avatar
флаг cn
Внимательно посмотрите на свою команду grep `grep "${EXEC_NAME}$"`. Виновником является второй знак доллара.
N0rbert avatar
флаг zw
Я предполагаю, что вы страдаете от современной функции символических ссылок. См. [Вопросы и ответы] (https://askubuntu.com/a/1313596/66509) о похожей проблеме с `dpkg -S`. На самом деле вы говорите об *альтернативе*, которая на самом деле не является *псевдонимом*.
Forivin avatar
флаг bn
@ mook765 Как этот второй знак доллара может быть виновником? Его удаление вызовет еще больше проблем, как объясняется в вопросе.
sudodus avatar
флаг jp
Кажется, достаточно знать начало имени. Вы можете попробовать использовать следующую командную строку: `apt-file search {/bin,/sbin,/usr/bin/,/usr/sbin}/name`; Вам не нужно `sudo` для этой команды.
Forivin avatar
флаг bn
Нет, этого недостаточно. Он вернет все пакеты, содержащие двоичный файл, начинающийся с этого имени. Очень плохая практика, крайне ненадежная, и ее следует избегать любой ценой в сценарии bash.
sudodus avatar
флаг jp
Я думал, что вы использовали его, чтобы найти соответствующий программный пакет, так что в основном это ручная операция, поддерживаемая небольшой командной строкой. Мне непонятно, чего вы хотите. Пожалуйста, объясни.
Forivin avatar
флаг bn
Мне нужен код, который принимает имя исполняемого файла/псевдоним/... в качестве входных данных и возвращает имя пакета, который его установит.
sudodus avatar
флаг jp
Если исполняемый файл является символической ссылкой, вам, возможно, придется следовать по ссылкам, пока вы не найдете настоящий исполняемый файл, и тогда я думаю, что `apt-file search /full/path/filename` будет работать. Я могу сделать это вручную, но для этого потребуется некоторое программирование в шеллскрипте. Например, у меня есть `rename`: /usr/bin/rename -> /etc/alternatives/rename -> /usr/bin/file-rename (который является perl-скриптом Ларри Уолла).
Forivin avatar
флаг bn
Это не сработает, потому что символическая ссылка создается сценарием postinst. Это не файл, содержащийся в пакете.
muru avatar
флаг us
Я думаю, что система альтернатив (`update-alternatives`) управляется почти исключительно с помощью сценариев сопровождающего, поэтому эта информация не фиксируется какой-либо легкодоступной базой данных.
James S. avatar
флаг de
Псевдоним не является символической ссылкой, а символическая ссылка не является псевдонимом. Номенклатура важна для предотвращения путаницы.
Рейтинг:1
флаг cn

Проблема с символическими ссылками в том, что они не обязательно устанавливаются пакетами.

Ты можешь использовать readlink -f [/путь/файл] чтобы (попытаться) получить путь к реальному файлу. Если /путь/файл это символическая ссылка, ссылка для чтения вернет файл, на который указывает символическая ссылка. Если есть цепочка символических ссылок, ссылка для чтения будет следовать за ними, пока не дойдет до разрыва цепочки или реального файла.

Затем вы можете использовать apt-файл для поиска пакетов.

Рейтинг:1
флаг it

Если вы скачаете гввв с командой

sudo apt установить dwww

вы можете использовать dwww-quickfind, один из его подпакетов, чтобы быстро его найти. Следующее взято с справочной страницы dwww:

dwww-быстрый поиск(8)

        Используется dwww-find(8) для быстрого поиска
        пакет, которому принадлежит программа.

Просто чтобы проверить интерфейс, с терминала запустил его на 10-15 команд, одни GNU, другие нет, без проблем. Например, когда я бежал

:~$ dwww-быстрый поиск человека

и результат был

человек-дб
ВИРТУАЛЬНО: man-db

Очевидно, что он следует символическим ссылкам, поэтому я предполагаю, что он также отслеживает псевдонимы. В любом случае, стоит попробовать.Даже если это не так, просто получить гввв стоит проблем. Тип dwww <любой-пакет> и ты поймешь.

Это похоже на человек команда на стероидах.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.