Mam skrypt powłoki do konwersji obrazów na efekt haftu. To jest skrypt: skrypt haftu
Ten skrypt jest częścią aplikacji internetowej. Działa normalnie na moim komputerze Mac, jednak po wdrożeniu na moim serwerze internetowym z systemem CentOS 7 zauważyłem, że kiedy go wywołuję (wyświetla stronę podręcznika), każda linia jest duplikowana, patrz:
hafty. sh:
SPOSÓB UŻYCIA: haft [-n numcolours] [-p wzór] [-t grubość] [-g graylimit]
ZASTOSOWANIE: haft [-n numcolours] [-p wzór] [-t grubość] [-g graylimit]
[-f fuzzval ] [-b bgcolor] [-a kąt] [-r zakres] [-i intensywność] [-e zakres]
[-f fuzzval] [-b bgcolor] [-a kąt] [-r zakres] [-i intensywność ] [-e zakres]
To tylko pierwsze wiersze, ale robi to dla każdej linii pomocy. Ponadto skrypt nie działa, ponieważ gdy przesyłam obraz w celu przekonwertowania go za pośrednictwem mojej aplikacji, skrypt generuje ogromne pliki (137 Mb) z oryginalnego pliku nawet 1 Mb.
Jestem naprawdę zdezorientowany, co się tutaj dzieje. Czy masz pojęcie, co może być tego przyczyną?
Czy może to być związane z systemem operacyjnym? Czy skrypt może żyć gdzie indziej i nazywać się jednocześnie dwiema wersjami, mimo że uruchamiam go z taką ścieżką lib/embroidery/embroidery.sh
?
Aktualizacja: Więc ten problem nie był związany z tym zachowaniem, co zostało dobrze wyjaśnione przez Johna, problem ze skryptem generującym ogromne pliki był jednak spowodowany starą wersją ImageMagick dostępną za pośrednictwem repozytorium CentOS, zaktualizowałem do wersji 7.0.3 i zadziałało jeszcze raz
Odpowiedzi:
W twoim skrypcie obserwuję, że komunikat pomocy jest generowany przez:
Przyjrzyjmy się uważnie poleceniu sed:
Problem polega na tym, że (1) domyślnie
sed
drukuje wszystko , co pozostało w obszarze wzorów na końcu poleceń, ale (2) polecenie4,$p
powoduje dodatkowy wydruk. Tak więc każda linia jest drukowana dwukrotnie.Jednym z rozwiązań jest użycie
-n
opcji, aby ukryć domyślny wydruk:Ponieważ OSX (BSD) i CentOS (Linux) używają różnych wersji sed, mogą wystąpić pewne problemy ze zgodnością.
Nawiasem mówiąc, ta nieco prostsza komenda sed działa dla mnie:
Mini przykład
Wyodrębniając tylko niektóre kluczowe linie, skrypt wygląda mniej więcej tak:
Jeśli uruchomimy ten skrypt, wynik wygląda następująco:
Zamieńmy powyższe polecenie sed na:
Teraz wynik wygląda następująco:
źródło
convert
w skrypcie. Nie wiedząc, jakich plików używasz i jakie opcje ustawiłeś, nie mogę zgadnąć, które wywołanie powoduje tworzenie zbyt dużych plików.bash -x embroidery arg1 arg2 ...
, aby zobaczyć, co faktycznie zostanie wykonane, a następnie zobaczyć, która jest pierwszą instrukcją, która produkuje pliki zbyt duże. Na marginesie, istnieje wiele nienotowane zmienne powłoki, które zostaną poddane globbing i podziałowi na słowa i które mogłyby być potencjalnym źródłem problemów, jeśli któryś z nazwami plików zawierać spacji, szelki?
,*
lub inne znaki powłoki aktywne.