現在、フロッピーディスクの大部分をバックアップし、後で使用するためにフォーマットする小さなスクリプトを書いています。
私は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
このプロセスの後、スクリプトはフロッピーディスクをフォーマットする必要があります。私の問題は、両方のバックアップコマンド(dd
とcp
)が成功した場合にのみ、スクリプトでフロッピーディスクをフォーマットすることです。
たとえば、dd
が不良ブロックのためにフロッピーディスクの1.44MBをすべてコピーできなかった場合は、フロッピーディスクをフォーマットしないでください。
両方のコマンドが成功したかどうかをテストするにはどうすればよいですか(ディスクのイメージとファイルの両方を常にバックアップするわけではないため、個別にテストする必要があります)?
Bashを使用しているので、追加するだけです。
set -e
をスクリプトの先頭に追加すると、いずれかのコマンドが失敗した場合は常に失敗します。
私はします:
ok=true
if dd ...; then
sync
else
ok=false
fi
cp ... || ok=false
if "$ok"; then
mformat...
fi
試してみてください:
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
最初のdd
コマンドに必要な構文のいくつかがあります:&&
は、「前に来るものが成功した場合にのみ、次に来るものを実行する」ことを意味します。
if
ステートメントは、コマンド(または一連のコマンド!)を受け取って実行し、最後に成功値をチェックします。だからあなたはできる:
if
dd etc. etc. && sync &&
cp etc. etc.
then
format etc.
fi
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