如何将xargs的输出连接到变量中?

问题描述 投票:0回答:1

在下面的代码中,在进入下一个循环之前,我需要在变量“ 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
string shell output gentoo
1个回答
0
投票

您正在寻找包的反向依赖性,包括直接和间接的包,这使您可以使用递归。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)

从软件包名称中删除类别不是一个好主意,因为即使在排除特殊类别(virtualacct-useracct-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
© www.soinside.com 2019 - 2024. All rights reserved.