Comment puis-je obtenir un code de sortie apt-get «verbeux»?

12

Comment puis-je obtenir un code de sortie «détaillé» pour apt-getque des erreurs comme celle-ci

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

avoir un code de sortie différent de celui des erreurs de téléchargement comme celle-ci

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)

Actuellement, les deux erreurs se terminent avec 100

Fondamentalement, j'aimerais que les erreurs de téléchargement se terminent avec un code différent de celui des erreurs comme la première. Si possible, j'aimerais que chaque erreur spécifique ait un code de sortie différent, mais l'exemple ci-dessus est le minimum dont j'ai besoin. Comment puis-je le faire dans une installation Ubuntu vanilla sans logiciel supplémentaire (à l'exception de aptitude)?

kiri
la source
Vous pouvez encapsuler la commande apt-get dans un script qui analyse la sortie. Ou est-ce que cela compte comme "logiciel supplémentaire"? De plus, pour détecter les erreurs de téléchargement, envisagez de faire d' apt-get --download-onlyabord.
Jos
Ah, ça a du sens. Peut-être pourriez-vous d'abord vérifier l'existence du paquet X en faisant apt-cache policy X?
Jos
Encore une fois, vous devrez grep la sortie. Je suppose que faire apt-cache policy google-chromene vous donne pas une ligne avec le mot «candidat», alors que le apt-cache policy google-chrome-stableferait.
Jos
D'ACCORD. Je déplace cette discussion vers le chat et saisis cette suggestion comme réponse (partielle).
Jos

Réponses:

1

Pas une réponse complète, mais vous pouvez d'abord tester l'existence de packages en faisant apt-cache policy Xet en saluant la sortie pour "Candidat (aucun)" ou "Impossible de trouver le package X", etc.

Jos
la source
A voté pour l'instant, mais comme vous l'avez dit, c'est partiel. N'hésitez pas à supprimer tous vos commentaires qui figurent dans une réponse maintenant. Merci pour votre aide
kiri
15

Je crois que ce n'est pas un cas de XY, et vous voulez juste pouvoir déboguer apt-get de manière générale. Sous de telles hypothèses, voici ma réponse.

Du man apt.conf:

OPTIONS DE DÉBOGAGE

L'activation des options dans la section Debug :: provoquera l'envoi d'informations de débogage au flux d'erreurs standard du programme en utilisant les bibliothèques apt, ou activera des modes de programme spéciaux qui sont principalement utiles pour déboguer le comportement d'apt.

Par conséquent, il vous suffit d'activer les règles pour chacun des comportements de débogage de apt-get:

  • Debug :: pkgProblemResolver : active la sortie sur les décisions prises par dist-upgrade, upgrade, install, remove, purge.
  • Debug :: NoLocking : désactive tout verrouillage de fichier. Cela peut être utilisé pour exécuter certaines opérations (par exemple, apt-get -s install) en tant qu'utilisateur non root.
  • Debug :: pkgDPkgPM : affiche la ligne de commande réelle à chaque fois qu'apt invoque dpkg (1).

Ces 3 sont les premiers que la page de manuel recommande, et le premier vous aidera à déboguer la première erreur que vous montrez. Pour la seconde, vous aurez peut-être besoin de:

  • Debug :: Acquire :: http : affiche les informations relatives au téléchargement de packages via HTTP. Il y a aussi https, ftp, cdrom.

La page de manuel en a beaucoup plus, vous pouvez les lister facilement en utilisant man apt.conf | grep -A5 -i debug.

Tout cela doit être écrit en utilisant la syntaxe correcte et ce sont des valeurs booléennes acceptées:

Debug::*::*  "true";

ou si vous souhaitez utiliser plusieurs lignes:

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

Si vous ne souhaitez exécuter que pour une instance d'apt-get, vous pouvez utiliser le commutateur -o/ --option:

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

Une autre méthode consiste à créer votre fichier de configuration personnalisé et à le charger avec le commutateur -c/ --config-file:

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

À propos de la modification des codes de sortie, je pense que vous ne pouvez pas sauf si vous modifiez le code source. apt-getest un logiciel de pointe , en tant que tel, il dispose de méthodes avancées pour déboguer le processus sans avoir besoin de s'appuyer sur des codes de sortie.

Braiam
la source
J'essaie en fait de mettre ces commandes dans un script qui peut fonctionner sans surveillance. Comment pourrais-je l'utiliser dans un script bash pour savoir si la première erreur s'est produite?
kiri
J'aimerais également le faire uniquement pour une instance spécifique de apt-get, pas tout le temps.
kiri
@ minerz029, vous pouvez utiliser l' -ooption pour exécuter des commandes ad hoc. Mis à jour ma réponse.
Braiam
À propos du premier commentaire, vous devriez faire quelque chose d'intelligent avec l'analyse de la sortie. Je n'ai pas l'idée aveugle comment pouvez-vous faire cela.
Braiam
En fait, j'ai réussi à faire fonctionner la sortie de apt-cache policy PACKAGE, comme l'a dit Jos. J'essayais de vérifier si un paquet était installable, je n'ai peut-être pas posé ma question correctement mais c'est une bonne réponse
kiri