web-dev-qa-db-fra.com

Comment puis-je vérifier les erreurs apt-get dans un script bash?

J'écris un script bash pour installer le logiciel et mettre à jour Ubuntu 12.04. J'aimerais que le script puisse vérifier les erreurs apt-get, en particulier lors de la mise à jour d'apt-get, de manière à pouvoir inclure des commandes correctives ou à quitter le script avec un message. Comment puis-je faire vérifier par mon script bash ce type d'erreur?

Editer le 21 mars: Merci Terdon pour la fourniture des informations dont j'avais besoin! Voici le script que j'ai créé avec une combinaison de vos suggestions pour vérifier les mises à jour, vérifier de nouveau les erreurs et signaler ensuite les erreurs. J'ajouterai ceci à un script plus long que j'utilise pour personnaliser les nouvelles installations Ubuntu.


#!/bin/bash

apt-get update

if [ $? != 0 ]; 
then
    echo "That update didn't work out so well. Trying some fancy stuff..."
    sleep 3
    rm -rf /var/lib/apt/lists/* -vf
    apt-get update -f || echo "The errors have overwhelmed us, bro." && exit
fi

echo "You are all updated now, bro!"
6
HarlemSquirrel

L'approche la plus simple consiste à laisser votre script continuer uniquement si apt-get se ferme correctement. Par exemple:

Sudo apt-get install BadPackageName && 
## Rest of the script goes here, it will only run
## if the previous command was succesful

Sinon, quittez si une étape a échoué:

Sudo apt-get install BadPackageName || echo "Installation failed" && exit

Cela donnerait le résultat suivant:

terdon@oregano ~ $ foo.sh
[Sudo] password for terdon: 
Reading package lists... Done
Building dependency tree       
Reading state information... Done
E: Unable to locate package BadPackageName
Installation failed

Ceci tire parti d’une caractéristique de base de bash et de la plupart (sinon de tous) des shells:

  • &&: continue uniquement si la commande précédente a réussi (l'état de sortie était 0)
  • ||: continue uniquement si la commande précédente a échoué (le statut de sortie n'était pas 0)

C'est l'équivalent d'écrire quelque chose comme ceci:

#!/usr/bin/env bash

Sudo apt-get install at

## The exit status of the last command run is 
## saved automatically in the special variable $?.
## Therefore, testing if its value is 0, is testing
## whether the last command ran correctly.
if [[ $? > 0 ]]
then
    echo "The command failed, exiting."
    exit
else
    echo "The command ran succesfuly, continuing with script."
fi

Notez que si un package est déjà installé, apt-get fonctionnera correctement et l’état de sortie sera 0.

12
terdon

Vous pouvez définir des options pour arrêter votre script comme suit:

set -o pipefail  # trace ERR through pipes
set -o errexit   # same as set -e : exit the script if any statement returns a non-true return value
0
Sylvain Pineau