The correct way to get the version of system-installed software is to use your package manager tools!
--version
is not a reliable way to do so, for several reasons:
Not all programs have executables. Libraries are a good example. You can't check your kernel version using linux --version
, as there is no such command. Or your video driver version.
Not all executables have command-line arguments. Most do, but GUI programs don't need to, and some don't.
--version
, as any command-line argument, is application-dependent. It depends on the developer to implement it, and there is no "standard" per-se, merely a convention. As you've noticed with -v|-V
, it is not consistent. Even --help
is not universal.
The format output of --version
is not consistent either. Some print a single line, some print several. Some print the version number only, some print the program name too.
That said, there is a standard, consistent way to get the installed version of any software in your system: ask the system, not the sofware!
Thanks to its Debian heritage, Ubuntu has a powerful package management system called apt
(actually, dpkg
). It controls installed packages, its dependencies, available repositories, and versions.
There are several package-management tools and front-ends you can use to query your installed packages. Here are some that display the version:
And if you don't know what package a given command belongs to, you can find out in several ways:
And the output is always consistent, reliable, standard, because you're not asking individual software made by distinct developers, you're querying your system about its status.
As an example, here's the result of a search of all the commands your mentioned in a single output:
$ dpkg --list wget gedit nano mysql-server skype php? firefox totem wine google-chrome*
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 Description
+++-==========================-==========================-====================================================================
ii firefox 42.0+build2-0ubuntu0.12.04 Safe and easy web browser from Mozilla
ii gedit 3.4.1-0ubuntu1 official text editor of the GNOME desktop environment
ii google-chrome-stable 46.0.2490.80-1 The web browser from Google
ii mysql-server 5.5.46-0ubuntu0.12.04.2 MySQL database server (metapackage depending on the latest version)
ii nano 2.2.6-1 small, friendly text editor inspired by Pico
ii php5 5.3.10-1ubuntu3.21 server-side, HTML-embedded scripting language (metapackage)
ii skype 4.3.0.37-0ubuntu0.12.04.1 client for Skype VOIP and instant messaging service
ii totem 3.0.1-0ubuntu21.1 Simple media player for the GNOME desktop based on GStreamer
ii wget 1.13.4-2ubuntu1.2 retrieves files from the web
ii wine 1.4-0ubuntu4.1 Microsoft Windows Compatibility Layer (meta-package)
--version
for Google chrome, I can use eithergoogle-chrome --version
orgoogle-chrome-stable --version
. Both give the same result. However, in the case ofdpkg --list
, why does onlydpkg --list google-chrome-stable
work? Fordpkg --list google-chrome
, I'm gettingdpkg-query: no packages found matching google-chrome
error!! – Milan Sep 19 '20 at 01:33google-chrome-stable
, and that package contains two executables,/usr/bin/google-chrome-stable
and/usr/bin/google-chrome
(and both are symlinks which which ultimately point to/opt/google/chrome/google-chrome
). So you can either ask the software invoking their executables, or askdpkg
using its package name. – MestreLion Sep 19 '20 at 19:38/usr/bin/google-chrome
is a soft link to/etc/alternatives/google-chrome
which is a soft link to/usr/bin/google-chrome-stable
. On the other hand/usr/bin/google-chrome-stable
is a soft link to/opt/google/chrome/google-chrome
. So, where does Linux stores the package name? I mean how does it confirms whether the package name isgoogle-chrome-stable
orgoogle-chrome
? – Milan Sep 21 '20 at 17:53dpkg
) knows is that is has several packages installed,google-chrome-stable
being one of them. That package contains a bunch of files, and executables, including/opt/google/chrome/google-chrome
, and the install script creates the soft links.dpkg
does not care if the names of the executables match the package name. It's just a bunch of files. – MestreLion Sep 23 '20 at 01:34dpgk
"Which files does package X contains?" (dpkg --listfiles <package>
), or "Which package does file Y belong to?" (dpkg --search <file>
), both of which are irrelevant for executing a given software once its package is installed. – MestreLion Sep 23 '20 at 01:43/etc/alternatives
is a mechanism for choosing between implementations of a given name, using soft links for that. It deals with files, not packages. If you have several text editors, likenano
andvi
. which one will beeditor
command? Or several Java versions, from different vendors, which one will be invoked when you simply typejava
? That's what the alternative system is for. So Google Chrome is creating an alternative too, maybe to allow co-existence of distinct chrome versions (stable, unstable, nightly, beta, long-term), one being your maingoogle-chrome
– MestreLion Sep 23 '20 at 01:58dpkg
) knows is that is has several packages installed,google-chrome-stable
being one of them." But does Ubuntu (ordpkg
) store the name of installed packages in any local file...I meanhtop
displays all the meaningful information by reading from various system files and doing some sort of calculation on it, right? So, doesdpkg
do anything like that? Sorry, if the question is too basic/off-topic! – Milan Oct 05 '20 at 11:04dpkg --listfiles <package>
&dpkg --search <file>
. However, why did you say "both of which are irrelevant for executing a given software once its package is installed."? If possible, could you please elaborate a little bit more on that or share any useful articles/links where I can read more by myself? – Milan Oct 05 '20 at 11:09/etc/alternatives
before. Thanks for sharing that one as well! You said "It deals with files, not packages." but, if I want to update the soft link manually then is it possible? e.g. right now,editor
is pointing tonano
byeditor -> /bin/nano*
but if I want to change togedit
then is there anydpkg
command whose output I can use to update the soft link foreditor
in/etc/alternatives
? I mean there are so many files forgedit
(output ofdpkg --listfiles gedit
), so, how can I decide which file to use to update that soft link? Thanks again:) – Milan Oct 05 '20 at 11:19