Bash

為什麼我的 shell 腳本不按順序執行?(可能是imagemagick?)

  • December 14, 2017

我製作了一個簡單的 bash shell 腳本來對目錄中的每個文件執行三個 imagemagick 命令。我沒有使用 & 也沒有 | 使每個命令同時執行。

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

在命令之間長時間使用 sleep 可以解決這個問題,但它非常草率。

旁注:我將目錄儲存在變數中,因為使用 $ 1/.jpg within a for loop fails to expand $ 1 和 * 顯然。Bash 返回一個錯誤,指出 /path/to/.jpg 不存在。

我正在使用 Ubuntu 16.04 (x86_64)、GNU bash 4.3.48 和 ImageMagick 6.8.9-9

$1內部功能與$1外部功能不同。

所以你需要在腳本開始時保存它:dir="$1",……並$dir在其他任何地方使用。

這樣,您將解決您自己注意到的第一件奇怪的事情(bash:路徑不存在)……但它可能會解決其他所有問題。

您的解決方法不完整,您必須將 vars 放在引號中,但隨後全球擴展將是錯誤的……您唯一能做的就是清理您的程式碼,因為您的腳本的簡化版本肯定會很好地工作:

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

引用自:https://unix.stackexchange.com/questions/410800