如何获取 bash 脚本中命令的版本

如何获取 bash 脚本中命令的版本

因此,正如问题所暗示的,我想获取 bash 脚本中命令的版本,而不是使用终端。

我知道所有可用的命令都以文件形式存在于目录中/usr/bin。但它没有提供版本,并且当您使用 cat 作为(命令)文件之一时,它会提供一些有趣的信息。

例如 -cat /usr/bin/man给出 -

有趣的输出

这是什么以及如何获取版本?

我使用的是 Ubuntu 20.04。

我知道在这里问这是一个愚蠢的问题,但我找不到任何东西:/

据说最终编辑 - 接受的答案对我有用,我正在使用该功能。

后来我也意识到类似的东西foo --version也会起作用

但是,如果您使用变量来存储版本,那么您需要小心语法,我的做法是错误的。感谢@Romeo Ninov 指出这
foo --version也有效。

对于这些愚蠢的错误我真的很抱歉。

答案1

如果您使用的是基于 Debian 的发行版,您可以使用包管理器来解决这个问题:

$ dpkg -S '*bin/man'
man-db: /usr/bin/man

这告诉我们man-db是拥有/usr/bin/man.

$ dpkg -l man-db
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name           Version      Architecture Description
+++-==============-============-============-=================================
ii  man-db         2.10.2-1     amd64        tools for reading manual pages

然后我们询问man-db安装的是什么版本。这是发行版发布的man-db上游版本,2.10.2带有额外的-1.代表-1发行版完成的补丁。这可能只包括构建规则,但也可能包括2.10.2从更高版本移植的修复。

dpkg-query可用于提取版本:

$ dpkg-query -W -f '${Version}\n' man-db
2.10.2-1

将所有这些放在一起:

$ dpkg-query -W -f '${Version}\n' $(dpkg -S '*bin/man' | cut -d: -f1)
2.10.2-1

或者一个可以进入的函数.bashrc

ver() {
  package=$(dpkg -S "*bin/$1" | cut -d: -f1)
  version=$(dpkg-query -W -f '${Version}' "$package")
  printf "%s\n" "$version"
}

ver man
2.10.2-1

(在幕后,dpkg -S确实是dpkg-query -S,但dpkg-query -S不能与 结合-W -f。)

答案2

AFAIK 没有固定的单一方法可以从任意命令获取版本foo(通过运行它或通过分析可执行文件)。有些foo可能会告诉你一些关于 的事情foo -v,另一些可能会告诉你关于、、 、 … 的foo -V事情;这完全取决于他们(即他们的作者)。foo --versionfoo --helpfoo -h

阅读手册 ( man foo) 以了解该工具支持哪些选项(如果有的话)。手册本身可能会告诉您版本(通常在底部或附近),但在这种情况下,它是手册描述的版本,不一定是您可以使用foo的版本。foo在从存储库安装工具及其手册的系统中,这些应该对应;但一般来说,可以foo在与手册描述不同的版本(或多个版本)中获取和使用。

您的发行版使用的软件包系统可以为您提供一种查看已安装软件包版本的可靠方法(Debian 及其衍生产品(包括 Ubuntu)的示例)。如果您知道您要使用的工具属于哪个包(再说一遍,对于 Debian 和……),通常可以从包的版本推断出工具的版本。

一般来说,可执行文件可能是也可能不是二进制格式;它可能是任意解释器的脚本。不需要它在文件中的任何位置包含其版本或在其输出中报告。在某些情况下,版本的整个概念并不适用。例如我的脚本来自这个另一个答案没有分配给它的版本。同样,我分析了这个包装器还有另一个答案没有版本(尽管它带有一个有版本的包)。

结论是您无法从可执行文件本身可靠地获取任意可执行文件的版本;除非它是一个特定的可执行文件并且您将脚本调整为它(即解析foo -V对于这个特定的可执行文件来说什么是正确的)。您可以获得软件包的版本。

我可以看到这个同时写的答案提供了一种获取拥有给定可执行文件的包版本的方法。那我就不会重新发明它了。

答案3

获取命令版本的常用方法是使用如下命令:

man --version

请注意,这可能会给您多行答案,因此您应该管理这一点。另外,对于每个命令,您都可以检查man页面。例如:

man man

您最终可以在其中看到版本。如果你想直接从二进制文件中获取它,你可以尝试使用

strings /usr/bin/man

并过滤结果

相关内容