Como posso verificar erros do apt-get em um script bash?

4

Estou escrevendo um script para instalar o software e atualizar o Ubuntu 12.04. Eu gostaria que o script pudesse verificar os erros do apt-get, especialmente durante o apt-get update, para que eu pudesse incluir comandos corretivos ou sair do script com uma mensagem. Como posso ter meu script bash para verificar esses tipos de erros?

Edite 21 de março: Obrigado terdon pelo fornecimento apenas a informação que eu precisava! Aqui está o script que eu criei com uma combinação de suas sugestões para verificar se há atualizações e verificar novamente quando os erros ocorrem e, em seguida, relatar de volta. Eu adicionarei isso a um script mais longo que estou usando para personalizar novas instalações do 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!"
    
por HarlemSquirrel 20.03.2014 / 15:22

2 respostas

8

A abordagem mais simples é fazer com que seu script continue somente se apt-get sair corretamente. Por exemplo:

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

Como alternativa, saia se alguma etapa tiver falhado:

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

Isso daria a seguinte saída:

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

Isso está tirando vantagem de um recurso básico do bash e da maioria (se não de todos) shells:

  • && : continue somente se o comando anterior foi bem-sucedido (teve um status de saída de 0)
  • || : continue apenas se o comando anterior falhou (teve um status de saída de não 0)

É o equivalente a escrever algo assim:

#!/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

Observe que, se um pacote já estiver instalado, apt-get será executado com êxito e o status de saída será 0.

    
por terdon 20.03.2014 / 15:35
0

Você pode definir opções para interromper seu script assim:

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
    
por Sylvain Pineau 20.03.2014 / 15:49