web-dev-qa-db-ja.com

bashスクリプトでapt-getエラーを確認するにはどうすればよいですか?

ソフトウェアをインストールしてUbuntu 12.04を更新するためのbashスクリプトを書いています。特に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!"
6
HarlemSquirrel

最も簡単なアプローチは、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

これは、bashとほとんどの(すべてではないにしても)シェルの基本機能を利用しています。

  • &&:前のコマンドが成功した場合にのみ続行します(終了ステータスが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になります。

12
terdon

Yoは、次のようにスクリプトを停止するオプションを設定できます。

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