Я пишу bash-скрипт для установки программного обеспечения и обновления Ubuntu 12.04. Мне бы хотелось, чтобы скрипт мог проверять наличие ошибок apt-get, особенно во время обновления apt-get, чтобы я мог включать корректирующие команды или выходить из скрипта с сообщением. Как я могу проверить мой bash-скрипт на наличие таких ошибок?
Редактировать 21 марта: Спасибо, Тердон, за предоставление именно той информации, которая мне была нужна! Вот сценарий, который я создал вместе с вашими предложениями, чтобы проверить наличие обновлений и перепроверить, когда возникают ошибки, а затем отчитаться. Я добавлю это в более длинный скрипт, который я использую для настройки новых установок 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!"
Самый простой подход должен иметь Ваш сценарий, продолжаются только если apt-get
выходы правильно. Например:
sudo apt-get install BadPackageName &&
## Rest of the script goes here, it will only run
## if the previous command was succesful
, С другой стороны, выход, если какие-либо шаги перестали работать:
sudo apt-get install BadPackageName || echo "Installation failed" && exit
Это дало бы следующий вывод:
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
Это использует в своих интересах основную характеристику удара, и большинство (если не все) окружает:
&&
: продолжите, только если предыдущая команда успешно выполнилась (имел статус выхода 0) ||
: продолжите, только если предыдущая неудавшаяся команда (имел статус выхода не 0) Это - эквивалент записи чего-то вроде этого:
#!/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
Примечание, которое, если пакет уже установлен, apt-get
, будет работать успешно, и статус выхода, будет 0.
Эй может установить опции остановить Ваш сценарий как это:
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