Todo processo tem um status de saída , que é um número entre 0 e 255. Existe uma convenção que é bonita muito universalmente seguido que 0 indica sucesso e qualquer outra coisa indica falha¹.
Em um script de shell, a variável especial $?
contém o status de saída do último comando. Se você precisar usá-lo mais de uma vez, salve-o em outra variável (caso contrário, o primeiro comando usando-o definirá $?
como seu status).
Geralmente, você não precisa usar $?
: você pode usar as construções condicionais do shell para reagir de maneira diferente a zero e diferente de zero.
if genisoimage …; then
rm rm -rf "$parent_path"
else
echo 1>&2 "genisoimage failed, aborting"
exit 2
fi
Você pode usar set -e
para alternar o script para o modo de erro ao sair: se um comando simples falhar (isto é, retornar um status diferente de zero), o script sairá imediatamente, com o mesmo status de saída. Por exemplo, se você colocar set -e
em algum lugar antes do loop for
, seu script sairá imediatamente se genisoimage
falhar.
Se você quiser manter o loop, mas registrar falhas, salve a contagem de erros atual em uma variável.
successes=0
failures=0
err=0
for file in $(find /shares/media/ -type d -name 'VIDEO_TS')
do
parent_path="$(dirname -- "$file")" # or parent_path=${file%/*}
iso_path="$parent_path.ISO"
echo "Converting to "$iso_name""
genisoimage -allow-limited-size -o "$iso_path" -dvd-video "$parent_path"
ret=$?
if ((ret == 0)); then
rm -rf "$parent_path"
((++successes))
else
((++failures))
if ((ret > err)); then ret=$err; fi
fi
done
echo "Succesfully converted "$total" videos to ISO. There were $failures failures."
exit $err
¹ Para comandos de busca como grep
, 0 significa “encontrado”, 1 significa “não encontrado” e outros valores significam “algum erro aconteceu”.