【问题标题】:How can I concatenate an output from xargs in a variable?如何将 xargs 的输出连接到变量中?
【发布时间】:2020-02-07 03:07:55
【问题描述】:

在下面的代码中,我需要在进入下一个循环之前提供变量“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

【问题讨论】:

  • "`echo $depend`" - 只是"$depend"

标签: string shell output gentoo


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2015-11-24
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 2019-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多