Verifique o sucesso do comando no bash

5

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)?

    
por TheKitsuneWithATie 04.10.2016 / 15:47

6 respostas

2

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.

    
por 04.10.2016 / 16:00
2

Eu faria:

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

cp ... || ok=false

if "$ok"; then
  mformat...
fi
    
por 04.10.2016 / 16:26
1

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
    
por 04.10.2016 / 16:01
1

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
    
por 04.10.2016 / 16:22
0

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
    
por 05.03.2017 / 22:15
0

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:

por 29.12.2017 / 07:09