Verifique si todos los packages listdos están instalados en bash

Mi binary depende de estas bibliotecas de impulso y packages respectivos:

NAME | PACKAGE: --------------------------------------+----------------------------------- libboost_serialization.so.1.55.0 | libboost-serialization1.55.0 libboost_thread.so.1.55.0 | ibboost-thread1.55.0 libboost_date_time.so.1.55.0 | libboost-date-time1.55.0 libboost_signals.so.1.55.0 | libboost-signals1.55.0 

Entonces me gustaría definir una list de packages:

 boostlibnames="libboost-serialization1.55.0 libboost-thread1.55.0 libboost-date-time1.55.0 libboost-signals1.55.0" 

Y ahora me gustaría comprobar si están todos instalados y solo entonces ejecutar la installation actual de apt-get install . Sé que apt verificará automáticamente si los packages ya están instalados, pero me gustaría indicarle al usuario si desea instalar las bibliotecas que faltan antes de hacerlo.

Entonces, ¿hay una buena manera de verificar si todas las bibliotecas listdas (en variable como arriba) están instaladas?

El command dpkg -s devuelve el estado de los packages instalados. Por ejemplo, en mi sistema, si lo ejecuto para firefox que está instalado y nedit que no, obtengo:

 $ dpkg -s firefox Package: firefox Status: install ok installed Priority: optional Section: web Installed-Size: 94341 Maintainer: Clement Lefebvre <root@linuxmint.com> Architecture: amd64 Version: 41.0~linuxmint1+betsy Replaces: firefox-l10n-af, firefox-l10n-ar, firefox-l10n-be, firefox-l10n-bg, firefox-l10n-bn-bd, firefox-l10n-ca, firefox-l10n-cs, firefox-l10n-da, firefox-l10n-de, firefox-l10n-el, firefox-l10n-en-gb, firefox-l10n-en-us, firefox-l10n-eo, firefox-l10n-es, firefox-l10n-et, firefox-l10n-eu, firefox-l10n-fa, firefox-l10n-fi, firefox-l10n-fr, firefox-l10n-fy, firefox-l10n-gl, firefox-l10n-gu, firefox-l10n-he, firefox-l10n-hi, firefox-l10n-hr, firefox-l10n-hu, firefox-l10n-id, firefox-l10n-is, firefox-l10n-it, firefox-l10n-ja, firefox-l10n-kn, firefox-l10n-ko, firefox-l10n-lt, firefox-l10n-lv, firefox-l10n-nb, firefox-l10n-nl, firefox-l10n-nn, firefox-l10n-pl, firefox-l10n-pt, firefox-l10n-pt-br, firefox-l10n-ro, firefox-l10n-ru, firefox-l10n-sk, firefox-l10n-sl, firefox-l10n-sq, firefox-l10n-sr, firefox-l10n-sv, firefox-l10n-th, firefox-l10n-tr, firefox-l10n-uk, firefox-l10n-zh Provides: gnome-www-browser, www-browser Breaks: firefox-l10n-en-us Description: The Firefox web browser The Mozilla Firefox Web Browser. $ dpkg -s nedit dpkg-query: package 'nedit' is not installed and no information is available Use dpkg --info (= dpkg-deb --info) to examine archive files, and dpkg --contents (= dpkg-deb --contents) to list their contents. 

Entonces, puede usar ese command para verificar si un package está instalado:

 #!/usr/bin/env bash run_install() { ## Prompt the user read -p "Do you want to install missing libraries? [Y/n]: " answer ## Set the default value if no answer was given answer=${answer:Y} ## If the answer matches y or Y, install [[ $answer =~ [Yy] ]] && apt-get install ${boostlibnames[@]} } boostlibnames=("libboost-serialization1.55.0" "libboost-thread1.55.0" "libboost-date-time1.55.0" "libboost-signals1.55.0" "nedit") ## Run the run_install function if sany of the libraries are missing dpkg -s "${boostlibnames[@]}" >/dev/null 2>&1 || run_install 

Lo siguiente le dará una list de todos los packages relevantes que no están instalados:

 dpkg -l $boostlibnames 2>&1 | awk '{if (/^D|^\||^\+/) {next} else if(/^dpkg-query:/) { print $6} else if(!/^[hi]i/) {print $2}}' 

Esto omite las líneas de encabezado de dpkg -l , y luego imprime las líneas donde dpkg-query se queja de un package desconocido, AND líneas que no comienzan con hi o ii (Inst Hold o Install Inst).

Por lo general, hago algo como awk 'NR<=5 {next} ; ...' awk 'NR<=5 {next} ; ...' o sed -e '1,5d' para deshacerse de las líneas de encabezado de dpkg -l , pero en este caso estamos networkingireccionando stderr a stdout para detectar quejas por dpkg-query y dpkg -l de salida, por lo que no podemos simplemente eliminar las primeras 5 líneas.

Esto mostrará los packages que nunca se instalaron, eliminaron, purgaron o donde la installation falló / se completó parcialmente debido a un error.