Como você está usando o bash, adicione:
set -e
para o início do seu script e ele falhará sempre que algum dos comandos falhar.
Atualmente, estou escrevendo um pequeno script para fazer o backup de grandes quantidades de disquetes e formatá-los posteriormente para uso posterior.
Eu uso dd
para copiar a imagem do disco e cp
para copiar todos os arquivos no disco.
Aqui estão os comandos que uso para fazer isso:
# 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
Após esse processo, o script precisa formatar o disquete. Meu problema é que quero que meu script formate o disquete apenas se os dois comandos de backup ( dd
e cp
) tiverem êxito.
Por exemplo, se dd
não puder copiar todos os 1,44 MB do disquete devido a blocos defeituosos, não formate o disquete.
Como posso testar se ambos os comandos foram bem-sucedidos (Eles devem ser testados separadamente, pois nem sempre faço backup da imagem e dos arquivos do disco)?
Como você está usando o bash, adicione:
set -e
para o início do seu script e ele falhará sempre que algum dos comandos falhar.
Eu faria:
ok=true
if dd ...; then
sync
else
ok=false
fi
cp ... || ok=false
if "$ok"; then
mformat...
fi
Experimente:
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
Você tem um pouco da sintaxe que você precisa no seu primeiro comando dd
: o &&
significa "somente execute o que vem a seguir se o que vier antes tiver sucesso."
A instrução if
recebe um comando (ou uma série de comandos!), executa-os e, em seguida, verifica o valor de sucesso no final. Então você poderia fazer:
if
dd etc. etc. && sync &&
cp etc. etc.
then
format etc.
fi
Um teste de uma linha seria
command_to_check && command_to_follow_if_previous_one_succeeds
Você também pode usar o seguinte one-liner se quiser continuar apenas se o comando anterior falhar.
command_to_check || command_to_follow_if_previous_one_fails
Para a verificação de erros , seus comandos:
execute [INVOKING-FUNCTION] [COMMAND]
execute () {
error=$($2 2>&1 >/dev/null)
if [ $? -ne 0 ]; then
echo "$1: $error"
exit 1
fi
}
Inspirado na manufatura enxuta:
Tags cp bash dd shell-script