在下面的代码中,在进入下一个循环之前,我需要在变量“ depend”上提供完整的输出。另外,手动测试命令“ 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
您正在寻找包的反向依赖性,包括直接和间接的包,这使您可以使用递归。equery
命令提供了查找间接依赖项的选项:-D
或--indirect
。还有一个选项应同时使用--depth=NUM
,因为许多程序包都在依赖循环中! (我只是在处理脚本时才发现它的)我使程序包管理器必须非常聪明才能避免这些循环!
例如,VLC的反向依赖关系树看起来像:
$ 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
调用或变量名的周围,以保留行分隔符。我相信,如果程序包在依赖项循环中,则此脚本不会终止。
#!/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