Как я могу объединить вывод из xargs в переменной? - PullRequest
0 голосов
/ 07 февраля 2020

В приведенном ниже коде мне нужно предоставить полный вывод для переменной «зависимость» перед переходом к следующему l oop. Кроме того, тестируя команду «equery» вручную, я увидел, что после ряда аргументов последующие сбрасываются непосредственно на терминал

#!/bin/bash

depend=$(equery depends "$@" | awk '{gsub("./*"," ",$1); gsub("-[0-9].*," ",$1); print $1}')

until
    new=""
    depend=$(echo $depend | xargs -n1 | sort -u | xargs)
    echo $depend
    new=$(equery depends `echo $depend` | xargs -n50 | awk '{gsub("./*"," ",$1); gsub("-[0-9].*," ",$1); print $1}')
    depend=$new
    [ -z $depend ]
do :; done

1 Ответ

0 голосов
/ 07 февраля 2020

Вы ищете обратные зависимости пакетов, как прямые, так и косвенные, что заставляет вас использовать рекурсию. Команда 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
...