web-dev-qa-db-ja.com

bashでコマンドの成功を確認する

現在、フロッピーディスクの大部分をバックアップし、後で使用するためにフォーマットする小さなスクリプトを書いています。

私はddを使用してディスクのイメージをコピーし、cpを使用してディスク上のすべてのファイルをコピーします。

これを行うために使用するコマンドは次のとおりです。

# Copying disk image
dd if="/dev/fd0" of="/path/to/backup/folder" &>/dev/null && sync

# Copying disk files
cp -R "/mnt/floppy/." "/path/to/backup/folder/" &>/dev/null

このプロセスの後、スクリプトはフロッピーディスクをフォーマットする必要があります。私の問題は、両方のバックアップコマンド(ddcp)が成功した場合にのみ、スクリプトでフロッピーディスクをフォーマットすることです。

たとえば、ddが不良ブロックのためにフロッピーディスクの1.44MBをすべてコピーできなかった場合は、フロッピーディスクをフォーマットしないでください。

両方のコマンドが成功したかどうかをテストするにはどうすればよいですか(ディスクのイメージとファイルの両方を常にバックアップするわけではないため、個別にテストする必要があります)?

5
Informancien

Bashを使用しているので、追加するだけです。

set -e

をスクリプトの先頭に追加すると、いずれかのコマンドが失敗した場合は常に失敗します。

2
techraf

私はします:

ok=true
if dd ...; then
  sync
else
  ok=false
fi

cp ... || ok=false

if "$ok"; then
  mformat...
fi
2

試してみてください:

dd <command>
DD_EXIT_STATUS=$?

cp <command>
CP_EXIT_STATUS=$?

if [[ DD_EXIT_STATUS -eq 0 && CP_EXIT_STATUS -eq 0 ]]; then
    format floppy disk
else
    ... other stuff ...
fi
1
Echoes_86

最初のddコマンドに必要な構文のいくつかがあります:&&は、「前に来るものが成功した場合にのみ、次に来るものを実行する」ことを意味します。

ifステートメントは、コマンド(または一連のコマンド!)を受け取って実行し、最後に成功値をチェックします。だからあなたはできる:

if
    dd etc. etc. && sync &&
    cp etc. etc.
then
    format etc.
fi
1
Jander

error proofingコマンドの場合:

execute [INVOKING-FUNCTION] [COMMAND]

execute () {
    error=$($2 2>&1 >/dev/null)

    if [ $? -ne 0 ]; then
        echo "$1: $error"
        exit 1
    fi
}

リーン生産におけるインスパイア

ワンライナーテストは

command_to_check && command_to_follow_if_previous_one_succeeds

前のコマンドが失敗した場合にのみ続行する場合は、次のワンライナーを使用することもできます。

command_to_check || command_to_follow_if_previous_one_fails
0
MichaelZ