`dnf list` 中 repo 名称前面的“@”是什么意思?

pol*_*mon 10 fedora package-management repository dnf

当我想列出已安装的软件包时,我通常采用以下两种方式之一。

老式的方法是使用rpm -qa | grep <whatever I look for>,仅此而已。

但最近我想要更全面地展示我的包,因此,我使用dnf list --installed <whatever I look for>.

但是,在查看结果时,有几件事我不明白。

考虑这个例子:

# dnf list --installed zsh                  
Last metadata expiration check: 0:13:25 ago on Mon Jul 11 05:48:04 2016.
Installed Packages
zsh.x86_64            5.2-5.fc24            @@commandline
Run Code Online (Sandbox Code Playgroud)

(实际打印的空间更宽)

所以结果条目是:«package» «version» «repo»。

在我的例子中是:

  • 包:zsh.x86_64
  • 版本:5.2-5.fc24
  • 回购:@@commandline

到目前为止,结果表是可以理解的,但我对 repo 名称前面的两个“@@”的含义感到困惑。

此外,“命令行”表明该软件包是从命令行安装的(下载 RPM,然后dnf install whatever.rpm 在命令行中安装,等等)。但是我很确定我已经zsh通过dnf install zsh.

但这还不是全部。

我在我的系统上从 repo 安装了几个包@System@fedora(但是也fedora没有@)和诸如@@commandline.

那么在回购名称前面的那个@@@确切的意思是什么?

为什么我已经安装了这么多突出的软件包,@@commandline尽管我非常确定我已经从 repos 安装了它们?

Max*_*ton 4

就让我在这里抛砖引玉吧。

dnf list all | less显示所有软件包(包括已安装和可用的软件包)。输出有两个部分:“已安装的包”和“可用的包”。所有“已安装的软件包”前面都有@符号,而“可用的软件包”则没有。所以我相信@迹象表明软件包已安装。如果安装了一个软件包但其原始存储库被删除,我想会@@给出标志。

dnf 源代码托管在https://github.com/rpm-software-management/dnf。下载src代码后,grep commandline -ri .在目录中执行a,它不会返回任何内容。然而,它的 github 页面确实提到了这一点,

它使用 RPM、libsolv 和 hawkey 库进行包管理。

因此,我查看了 hawkey,它托管在同一项目下,网址为https://github.com/rpm-software-management/hawkey。通过查看其代码grep -ri commandline .,它确实显示了一些结果。

./src/types.h:#define HY_CMDLINE_REPO_NAME "@commandline"
./hawkey.spec:- fix: commandline RPMs do not provide their files (RhBug:1112810) (Ales Kozumplik)
Run Code Online (Sandbox Code Playgroud)

所以commandline来自hawkey包。至于为什么@comandline在命令中显示的问题dnf list,我的疯狂猜测是dnf代码无法正确使用hawkey

  • “我这里扔一块砖,引点玉石吧。” ...我完全不知道这种令人敬畏且难以理解的表达方式意味着什么,但我想我喜欢它。[“成语!”](https://www.youtube.com/watch?v=mY9gVIcRkkI) (2认同)