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

Ant*_*rma 2 linux shell-script command

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

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

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

有趣的输出

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

我使用的是 Ubuntu 20.04。

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

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

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

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

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

Ste*_*art 7

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

$ dpkg -S '*bin/man'
man-db: /usr/bin/man
Run Code Online (Sandbox Code Playgroud)

这告诉我们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
Run Code Online (Sandbox Code Playgroud)

然后我们询问安装的是什么版本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
Run Code Online (Sandbox Code Playgroud)

把所有这些放在一起:

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

或者一个可以进入的函数.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
Run Code Online (Sandbox Code Playgroud)

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


Kam*_*ski 5

AFAIK 没有固定的单一方法可以从任意命令获取版本foo(通过运行它或通过分析可执行文件)。有些foos 可能会告诉您一些有关 的信息foo -v,其他一些foo -V则可能会告诉您有关foo --version, foo --help, foo -h, \xe2\x80\xa6 的信息;这完全取决于他们(即他们的作者)。

\n

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

\n

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

\n

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

\n

结论是您无法从可执行文件本身可靠地获取任意可执行文件的版本;除非它是一个特定的可执行文件并且您将脚本调整为它(即解析foo -V任何适合该特定可执行文件的内容)。您可以获得软件包的版本。

\n

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

\n