直接回答问题,如问:
在 Yum (/usr/share/yum-cli/output.py) 源代码中找到:
if self.conf.debuglevel < 2 or not sys.stdout.isatty():
progressbar = None
callback = None
else:
progressbar = YumTextMeter(fo=sys.stdout)
callback = CacheProgressCallback()
所以,hacky 的解决方案是为 Yum 分配一个 pty ......
不幸的是,现有的 Java 库似乎不提供对 Linux 用于分配 PTY 的 ptmx 接口的访问(尽管可以想象,使用 JNI 绑定可以做到这一点 - 代码不会非常复杂;尽管快速谷歌搜索没有找到任何好的库存库来这样做,所以也许我缺少一些东西,或者我怀疑现在应该有人在附近),所以“最简单”的方法可能是写一个Python 包装器,它调用 Yum 内部进行投标,并要求回调。无论哪种方式,都不是纯 Java,而是链接到外部 Python 解释器(而且,由于 Yum 是 Python,你知道必须安装一个)可能比使用 JNI 链接一些 C 代码更容易。(举个例子,
然而:
或者,您是否考虑过使用 pkcon 或使用 DBus 与 PackageKit 通信?
使用 DBus 不需要外部库,但可能需要重新考虑您的安装过程。在http://dbus.freedesktop.org/doc/dbus-java/有一个 Java DBus 库,它包装了连接逻辑,此时,http://www.packagekit.org/pk-faq.html中的示例#session-methods应该为您提供访问它的要点。我相信DBus 接口提供了一种在事务处理过程中检查事务的方法——但我对 DBus 不够熟悉,无法对此做出可靠的陈述。这可能是我看到的最不“hacky”的解决方案;而且,作为奖励,它至少可以移植到 Ubuntu(我相信)。
但是,pkcon 将是一种选择。它似乎以一种很好的、可解析的格式将进度写入标准输出,即使它在不是 tty 时确实会减少其输出:
$ pkcon update > tmp < /dev/null & tail -f tmp
Transaction: Updating packages
Status: Waiting for authentication
Status: Waiting in queue
Status: Starting
Status: Resolving dependencies
Status: Downloading packages
Percentage: 10
Percentage: 40
Percentage: 50
Percentage: 70
那是实际的输出,所以粒度不是很大,但它看起来对解析很友好。
恐怕我没有可供比较的 Fedora 14 盒子——这是在 Fedora 15 上——所以你的里程可能会有所不同。