シェルスクリプトが順番に実行されないのはなぜですか? (おそらくimagemagick?)

シェルスクリプトが順番に実行されないのはなぜですか? (おそらくimagemagick?)

私は、ディレクトリ内の各ファイルに対して3つのimagemagickコマンドを実行する単純なbashシェルスクリプトを作成しました。各コマンドを同時に実行するために&または|を使用しませんでした。

#!/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

ディレクトリに.jpgファイルがある場合は、エラーメッセージが表示されます。 ImageMagickは、ファイルが完了する前にbashにコマンドが完了したことを伝えますか?

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.

コマンド間で長いスリープモードを使用すると、この問題を解決できますが、非常に粗雑です。

注:forループで$ 1 / * .jpgを使用すると、明らかに$ 1と*が拡張されないため、ディレクトリを変数に保存しています。 Bash は、/path/to/*.jpg が存在しないというエラーを返します。

私はUbuntu 16.04(x86_64)、GNU bash 4.3.48、およびImageMagick 6.8.9-9を使用しています。

ベストアンサー1

$1内部機能は外部機能とは異なります$1

dir="$1"したがって、スクリプト start: , ... に保存し、$dir他の場所で使用する必要があります。

これにより、自分で見つけた最初の奇妙な問題(bash:パスが存在しない)を解決できますが、...おそらく他のすべての問題は解決されます。

解決策が不完全です。変数を引用符で囲む必要がありますが、グローバル拡張は間違っています...スクリプトの単純化されたバージョンは確かにうまく機能するので、コードを整理するだけです。

#!/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

おすすめ記事