Вы ищете обратные зависимости пакетов, как прямые, так и косвенные, что заставляет вас использовать рекурсию. Команда equery
предоставляет возможность поиска косвенных зависимостей: -D
или --indirect
. Есть еще одна опция, которая должна использоваться одновременно --depth=NUM
, потому что многие пакеты находятся в циклах зависимостей! (Я только что обнаружил это, работая над вашим сценарием). Это заставляет меня думать, что менеджер пакетов должен быть действительно умным, чтобы избежать этих циклов!
Например, дерево обратных зависимостей VL C выглядит так:
$ equery --quiet depends --indirect vlc
media-libs/phonon-vlc-0.11.1
media-libs/phonon-4.11.1-r1
kde-apps/kio-extras-19.12.2
kde-plasma/plasma-workspace-5.17.5-r1
virtual/notification-daemon-0
x11-libs/libnotify-0.7.8
media-video/vlc-3.0.8
(Many other reverse dependencies removed)
Не рекомендуется удалять категорию из имени пакета, поскольку существуют пакеты с одинаковыми именами в разных категориях, даже если исключены специальные категории (virtual
, acct-user
, acct-group
):
app-vim/json
dev-haskell/json
dev-java/json
dev-ruby/json
Вы можете найти их с помощью команды:
cd /var/db/repos/gentoo/;ls -1d */*|grep -v "^acct-"|grep -v virtual|cut -d '/' -f2|sort|uniq -c|sort -n|tail -n50
Возвращаясь к вашему сценарию, я внес изменения, чтобы он работал. Наиболее важным является размещение "
вокруг equery
вызовов или имен переменных для сохранения разделителей строк при необходимости. Я полагаю, что этот сценарий не завершится, если пакет находится в зависимости l oop.
#!/bin/bash
depend="$(echo "$@" | xargs -n1 equery depends | awk '{gsub("-[0-9].*","",$1); print $1}')"
until
depend="$(echo "$depend" | sort -u)"
test="$depend"
echo Reverse dependencies
echo "$depend"
new="$(echo $depend | xargs -n1 equery depends | awk '{gsub("-[0-9].*","",$1); print $1}')"
depend="$new"
[ -z "$test" ]
do :; done