verifique se genisoimage foi bem-sucedido

verifique se genisoimage foi bem-sucedido

Eu uso um script para converter todos os diretórios VIDEO_TS para .ISO. Como posso verificar se o genisoimage está realmente convertendo-o em vez de falhar e converter a próxima pasta?

Após a conversão, tenho um comando para excluir a pasta, mas se o genisoimage falhar, ele ainda a exclui.

#!/bin/bash
iso_name=""
parent_path=""
full_path=""
total=0

IFS=$'\n'
clear

for file in $(find /shares/media/ -type d -name 'VIDEO_TS')
do

parent_path="$(dirname -- "$file")"
full_path="$file"
iso_name="$(basename -- "$parent_path").ISO"
iso_path=""$(dirname -- "$parent_path")"/"$iso_name""

echo "Converting to "$iso_name""

((total++))
genisoimage -allow-limited-size -o  "$iso_path" -dvd-video "$parent_path"
rm -rf "$parent_path" 

done

echo "Succesfully converted "$total" videos to ISO!"

Responder1

Todo processo tem umstatus de saída, que é um número entre 0 e 255. Existe uma convenção que é praticamente universalmente seguida de que 0 indica sucesso e qualquer outro indica fracasso¹.

Em um script 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 a usá-lo será definido $?com seu status).

Freqüentemente, 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 -epara alternar o script para o modo de erro ao sair: se um comando simples falhar (ou seja, retornar um status diferente de zero), o script será encerrado imediatamente, com o mesmo status de saída. Por exemplo, se você colocar set -ealgum lugar antes do forloop, seu script será encerrado imediatamente se genisoimagefalhar.

Se você quiser continuar em 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 pesquisa como grep, 0 significa “encontrado”, 1 significa “não encontrado” e outros valores significam “algum erro aconteceu”.

informação relacionada