Entendiendo la salida de dpkg-query status

Publicado 2018-08-21.
Palabras clave: dpkg

Entendiendo la salida de dpkg-query status

Estoy interesado en saber si un paquete está instalado en el sistema (debian).

Para ello se puede utilizar dpkg -l, por ejemplo consultando el estado del paquete network-manager:

$ dpkg -l network-manager
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  network-manager                   1.12.2-2              amd64                 network management framework (daemon and userspace tools)

Ahora, interesa obtener la misma información para utilizar en un script sin tener que utilizar expresiones regulares para parsear la salida.

Para ello se pueden utilizar los comandos dpkg o dpkg-query.

La diferencia entre ellos está descrita en la página del manual de dpkg:

dpkg can also be used as a front-end to dpkg-deb(1) and dpkg-query(1). The list of supported actions can be found later on in the ACTIONS section. If any such action is encountered dpkg just runs dpkg-deb or dpkg-query with the parameters given to it, but no specific options are currently passed to them, to use any such option the back-ends need to be called directly.

Ya que se desea controlar lo más posible la salida del comando se utilizará dpkg-query:

$ dpkg-query -W -f '${Status}\n' network-manager
install ok installed

Para entender la salida conviene utilizar la página del manual de dpkg que explica las flags que puede tener un paquete:

Package flags

ok A package marked ok is in a known state, but might need further processing.

reinstreq A package marked reinstreq is broken and requires reinstallation. These packages cannot be removed, unless forced with option --force-remove-reinstreq.

En comparación, la página del manual de dpkg-query no es tan clara:

Error flags:

<empty> = (none)

R = Reinst-require

Ambas páginas listan de forma similar los Package states y los Package selection states, pero solo la página del manual de dpkg los explica.