Bash
為什麼我的 shell 腳本不按順序執行?(可能是imagemagick?)
我製作了一個簡單的 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