Linux - Bash - 获取$ releasever和$ basearch值?

Mik*_*ell 8 linux bash yum

我正在编写一个bash脚本来使用reposync从远程repos中提取包,所以我可以将我的节点指向本地.因此,我试图保持本地repo configs尽可能与usptream repo configs相似,如下所示:

# upstream
baseurl=http://mirror.freedomvoice.com/centos/$releasever/os/$basearch/

# local
baseurl=http://user:password@repo.example.com/centos/stable/$releasever/os/$basearch/
Run Code Online (Sandbox Code Playgroud)

在bash脚本中,是否有更简洁的方法来获取$ releasever和$ basearch值?我在考虑做以下事情:

yum_metadata=$(yum version nogroups)
Run Code Online (Sandbox Code Playgroud)

哪个回报:

Loaded plugins: versionlock Installed: 6/x86_64 360:6167019baac7e76f94c26320424dc41a7f046a70 version
Run Code Online (Sandbox Code Playgroud)

然后regexing为6/x86_64值.有点凌乱,寻找更优雅的方法.

alv*_*its 16

大多数发行版使用distroverpkg版本来获取发布者和basearch.

如果你看一下/etc/yum.conf,你会看到发行版设置为redhat-release(对于RHEL),enterpriseelinux-release(对于OEL)以及其他.

要获取包名称:

distro=$(sed -n 's/^distroverpkg=//p' /etc/yum.conf)
Run Code Online (Sandbox Code Playgroud)

要获得释放者:

releasever=$(rpm -q --qf "%{version}" -f /etc/$distro)
Run Code Online (Sandbox Code Playgroud)

获得basearch:

basearch=$(rpm -q --qf "%{arch}" -f /etc/$distro)
Run Code Online (Sandbox Code Playgroud)

上面的新代码将尝试获取与文件关联的包/etc/$distro.一些Linux增加/etc/redhat-release了他们的软件包版本.

如果你得到file not owned by any package然后使用/etc/*-release你的发行版附带的文件.可能是/etc/centos-release.

您可以/etc/*-release通过检查与centos打包的文件来检查适合此代码的相应内容.

rpm -qf /etc/*-release
Run Code Online (Sandbox Code Playgroud)

然后使用此文件而不是上面的第一行.

distro=/etc/centos-release
Run Code Online (Sandbox Code Playgroud)

以下是OEL的一个示例,其中/etc/redhat-release打包为enterprise-release.

rpm -q --qf "%{name}" -f /etc/redhat-release
Run Code Online (Sandbox Code Playgroud)

输出:

enterprise-release
Run Code Online (Sandbox Code Playgroud)

  • @CraigRinger - 这个答案已经有一段时间了。`basearch=$(rpm —eval %{_arch})` 即使在 Fedora 上也应该可以工作。 (2认同)
  • @alvits 已确认。谢谢。RH/Fedora 没有为此提供方便、有文档记录且稳定的接口,这是相当荒谬的。 (2认同)