¿Cómo puedo obtener un código de salida apt-get 'detallado'?

12

¿Cómo puedo obtener un código de salida 'detallado' para apt-getque errores como este

Package google-chrome is a virtual package provided by:
  google-chrome-stable 29.0.1547.76-r223446
  google-chrome-beta 30.0.1599.47-1
You should explicitly select one to install.

E: Package 'google-chrome' has no installation candidate

tener un código de salida diferente al de errores de descarga como este

Err http://dl.google.com/linux/chrome/deb/ stable/main google-chrome-stable amd64 29.0.1547.76-r223446
  Something wicked happened resolving 'dl.google.com:http' (-11 - System error)

Actualmente, ambos errores salen con 100

Básicamente, me gustaría que los errores de descarga salgan con un código diferente al de los errores como el primero. Si es posible, me gustaría que cada error específico tenga un código de salida diferente, pero el ejemplo anterior es el mínimo que necesito. ¿Cómo puedo hacer esto en una instalación vainilla de Ubuntu sin software adicional (con la excepción de aptitude)?

kiri
fuente
Puede ajustar el comando apt-get en un script que analice la salida. ¿O eso cuenta como "software adicional"? Además, para detectar errores de descarga, considere hacer apt-get --download-onlyprimero.
Jos
Ah, eso tiene sentido. ¿Quizás podrías verificar la existencia del paquete X primero haciendo apt-cache policy X?
Jos
Nuevamente, necesitaría grep la salida. Supongo que hacerlo apt-cache policy google-chromeno le da una línea con la palabra "Candidato", mientras que lo apt-cache policy google-chrome-stableharía.
Jos
OKAY. Estoy moviendo esta discusión al chat e ingresando esta sugerencia como respuesta (parcial).
Jos

Respuestas:

1

No es una respuesta completa, pero primero puede probar la existencia de paquetes haciendo apt-cache policy Xy seleccionando la salida para "Candidato (ninguno)" o "No se pudo encontrar el paquete X", etc.

Jos
fuente
Votaron por ahora, pero como dijiste, es parcial. Siéntase libre de eliminar todos sus comentarios que están en una respuesta ahora. Gracias por su ayuda
kiri
15

Creo que este no es un caso de XY, y solo desea poder depurar apt-get en general. Bajo tales supuestos aquí está mi respuesta.

De la man apt.conf:

OPCIONES DE DEPURACIÓN

Habilitar las opciones en la sección Debug :: hará que la información de depuración se envíe al flujo de error estándar del programa utilizando las bibliotecas apt, o habilitará modos de programa especiales que son principalmente útiles para depurar el comportamiento de apt.

Por lo tanto, solo necesita activar las reglas para cada uno de los comportamientos de depuración de apt-get:

  • Debug :: pkgProblemResolver : habilita la salida sobre las decisiones tomadas por dist-upgrade, upgrade, install, remove, purge.
  • Debug :: NoLocking : deshabilita todo el bloqueo de archivos. Esto se puede usar para ejecutar algunas operaciones (por ejemplo, apt-get -s install) como usuario no root.
  • Debug :: pkgDPkgPM : imprime la línea de comando real cada vez que apt invoca dpkg (1).

Esos 3 son los primeros que recomienda la página de manual, y el primero lo ayudará a depurar el primer error que muestre. Para el segundo, puede necesitar:

  • Debug :: Acquire :: http : Imprime información relacionada con la descarga de paquetes usando HTTP. También hay https, ftp, cdrom.

La página de manual tiene muchos más, puede enumerarlos fácilmente usando man apt.conf | grep -A5 -i debug.

Todo esto debe escribirse utilizando la sintaxis correcta y se aceptan valores booleanos:

Debug::*::*  "true";

o si quieres usar varias líneas:

Debug {
  Acquire {
    http "true";
    ftp "true";
  };
  NoLocking "true";
};

Si desea ejecutar solo una instancia de apt-get, puede usar el modificador -o/ --option:

sudo apt-get -o Debug::pkgProblemResolver=true -o Debug::Acquire::http=true -f install 

Otro método es crear su archivo de configuración personalizado y cargarlo con el modificador -c/ --config-file:

sudo apt-get -c debug-apt.conf install hello

Acerca de cambiar los códigos de salida, creo que no puede hacerlo a menos que cambie el código fuente. apt-getes una pieza de software de última generación , como tal, tiene métodos avanzados para depurar el proceso sin la necesidad de depender de códigos de salida.

Braiam
fuente
Realmente estoy tratando de poner estos comandos en un script que puede ejecutarse sin supervisión. ¿Cómo usaría esto en un script bash para encontrar si ocurrió el primer error?
kiri
También me gustaría hacer esto solo para una instancia específica de apt-get, no todo el tiempo.
kiri
@ minerz029 puede usar la -oopción para ejecutar comandos ad-hoc. Actualicé mi respuesta.
Braiam
Sobre el primer comentario, debe hacer algo inteligente al analizar la salida. No tengo ni idea de cómo puedes hacer eso.
Braiam
De hecho, conseguí trabajar con grepping la salida de apt-cache policy PACKAGE, como dijo Jos. Yo estaba tratando de comprobar si un paquete se puede instalar, puede que no haya pedido a mi pregunta correcta, pero esto es una buena respuesta
kiri