Por que meu script de shell não é executado sequencialmente? (pode ser imagemagick?)

1

Eu fiz um script de shell bash simples para executar três comandos imagemagick em cada arquivo em um diretório. Eu não usei & nem | para fazer com que cada comando seja executado simultaneamente.

#!/bin/bash


jpg="$1/*.jpg"
jpeg="$1/*.jpeg"
JPG="$1/*.JPG"
png="$1/*.png"
#convert to png
to_png() {
    for file in $jpg; do mogrify -format png $file; rm $file; done
    for file in $jpeg; do mogrify -format png $file; rm $file; done
    for file in $JPG; do mogrify -format png $file; rm $file; done
}

#format for 4k
to_4k() {
    for file in $png; do convert $file -resize 3840x2160 $file; done
}

#put on transparent background
to_trans() {
    for file in $png; do composite -gravity center $file -geometry 3840x2160 /path/to/transparent/background $file; done
}

do_stuff() {

    to_png
    to_4k
    to_trans

}

if [ -d "$1" ];
then do_stuff
else echo "You didn't enter a directory. Please try again."
fi

Quando existem arquivos .jpg no diretório, recebo mensagens de erro. O ImageMagick está dizendo ao bash que o comando está completo antes que o arquivo seja finalizado?

convert: Expected 8 bytes; found 0 bytes '/path/to/picture/image.png' @ warning/png.c/MagickPNGWarningHandler/1669.
convert: Read Exception '/path/to/picture/image.png' @ error/png.c/MagickPNGErrorHandler/1643.
convert: corrupt image '/path/to/picture/image.png' @ error/png.c/ReadPNGImage/3973.
convert: no images defined '/path/to/picture/image.png' @ error/convert.c/ConvertImageCommand/3210.
composite: Expected 8 bytes; found 0 bytes '/path/to/picture/image.png' @ warning/png.c/MagickPNGWarningHandler/1669.

Usar o modo de suspensão por um longo período entre os comandos soluciona esse problema, mas é bem desleixado.

Nota lateral: Eu armazenei diretórios em variáveis porque usar $ 1 / *. jpg dentro de um loop for não expande $ 1 e * aparentemente. O Bash retorna um erro dizendo que o /path/to/*.jpg não existe.

Estou usando o Ubuntu 16.04 (x86_64), o GNU bash 4.3.48 e o ImageMagick 6.8.9-9

    
por soundssilver 14.12.2017 / 07:05

1 resposta

2

$1 dentro da função não é o mesmo que $1 fora da função.

então você precisa salvá-lo no script begin: dir="$1" , ... e usar $dir em qualquer outro lugar.

desta forma você vai resolver a primeira coisa estranha que você percebeu (bash: o caminho não existe) ... mas provavelmente resolverá tudo o resto.

A sua maneira de resolver não estava completa, você deve colocar aspas entre aspas, mas a expansão do globo estará errada ... e a única coisa que você pode fazer é limpar o código porque a versão simplificada do script funciona bem :

#!/bin/bash

shopt -s nullglob ; set -o xtrace           #xtrace for debug
dir="$1" ; [ -d "$dir" ] || dir=.
for file in "$dir"/*.{jpg,jpeg,JPG}; do mogrify -format png "$file"; rm "$file"; done
for file in "$dir"/*.png; do convert "$file" -resize 3840x2160 "$file"; done
for file in "$dir"/*.png; do composite -gravity center "$file" -geometry 3840x2160 /home/d/bin/youtube_tools/4kclear.png "$file"; done
    
por 14.12.2017 / 17:13