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!"
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.
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