Evitar que un proceso secundario (HandbrakeCLI) provoque la salida del script primario
Tengo un script de conversión por lotes para convertir .mkvs de varias dimensiones en .mp4s de tamaño ipod / iphone, recortando / ajustando a medida. Determinar las dimensiones originales, el recorte requerido, el archivo de salida funciona bien. Sin embargo, al completar con éxito la primera conversión, HandbrakeCLI hace que la secuencia de comandos principal se cierre. ¿Por qué sería esto? ¿Y cómo puedo detenerlo?
El código, tal como está actualmente:
#!/bin/bash
find . -name "*.mkv" | while read FILE
do
# What would the output file be?
DST=../Touch/$(dirname "$FILE")
MKV=$(basename "$FILE")
MP4=${MKV%%.mkv}.mp4
# If it already exists, don't overwrite it
if [ -e "$DST/$MP4" ]
then
echo "NOT overwriting $DST/$MP4"
else
# Stuff to determine dimensions/cropping removed for brevity
HandbrakeCLI --preset "iPhone & iPod Touch" --vb 900 --crop $crop -i "$FILE" -o "$DST/$MP4" > /dev/null 2>&1
if [ $? != 0 ]
then
echo "$FILE had problems" >> errors.log
fi
fi
done
También lo intenté con una trampa, pero eso no cambió el comportamiento (aunque la última trampa sí se disparó)
trap "echo Handbrake SIGINT-d" SIGINT
trap "echo Handbrake SIGTERM-d" SIGTERM
trap "echo Handbrake EXIT-d" EXIT
trap "echo Handbrake 0-d" 0
Editado para agregar:
El hecho de que la trampa '0' se disparó me llevó a investigar por qué podría ser eso. Ejecutando comobash -x $script
reveló que elfind | while read
El ciclo está terminando prematuramente.
He refactorizado la búsqueda y la codificación en scripts separados. El bucle de búsqueda es ahora:
find . -name "*.mkv" | while read FILE
do
handbrake-touch "$FILE"
if [ $? != 0 ]
then
echo "$FILE had problems" >> errors.log
fi
done
El comportamiento sigue siendo el mismo: una codificación seguida de la terminación del bucle while. Si solo pongo un 'echo $ FILE' en lugar del 'handbrake-touch', se enumeran todos los archivos. El directorio actual no cambia (me preguntaba qué podría romper elfind | while
)