Jak wysłać cytowany argument do call-process

Sep 15 2020

Chcę użyć convertpolecenia imagemagick, aby narysować plik obrazu. Mam dane obrazu jako nieprzetworzony tekst w buforze i teraz chciałbym na nim uruchomić convert - -draw 'rectangle 0,0,100,100' -(myślniki mówią konwertować, aby użyć stdin do wprowadzania i wydrukować dane na standardowe wyjście). Jeśli pominę, -draw 'rectangle 0,0,100,100'to mogę po prostu użyć (call-process-region (point-min) (point-max) "convert" t t nil "-" "-")do przekazania zawartości bufora jako stdin do programu konwertującego i wstawić ze convertzwróconych danych obrazu do bufora (to nic nie robi, ale działa, np.Mógłbym zastąpić ostatni -z nazwą pliku aby zapisać wynikowe dane obrazu do pliku). Jednak teraz chcę dodać -draw 'rectangle 0,0,100,100'jako dodatkowy argument, call-process-regionale naprawdę nie mogę dowiedzieć się, jak to zrobić poprawnie. Na przykład próbowałem, (call-process-region (point-min) (point-max) "convert" t t nil "-" "-draw" "'rectangle 0,0,50,50'" "-")ale potem dostaję wiadomośćconvert: non-conforming drawing primitive definition prostokąt 0,0,50,50 "@ error / draw.c / RenderMVGContent / 4473."

Próbowałem uruchomić go jako polecenie powłoki (tj. Używając /bin/bash -c)? Ale wtedy nie wiem, jak przekazać zawartość bufora jako dane wejściowe.

Chciałbym więc wiedzieć, jak poprawnie przekazać ciąg znaków w apostrofach 'rectangle 0,0,100,100'do polecenia.

(Do Twojej wiadomości chciałbym rozszerzyć djvu.el o wyświetlanie adnotacji)

Odpowiedzi

2 phils Sep 15 2020 at 20:13

Chciałbym biegać convert - -draw 'rectangle 0,0,100,100' -

Zauważ, że cytujesz tam powłokę, aby nie rozbiła tego argumentu na dwie części ze względu na spację.

Na przykład próbowałem (call-process-region (point-min) (point-max) "convert" t t nil "-" "-draw" "'rectangle 0,0,50,50'" "-")

Zwróć uwagę, że w wywołaniu, które nie jest przetwarzane przez powłokę, umieściłeś cudzysłowy dotyczące powłoki, co oznacza, że convertproces otrzymuje argument zawierający te 'otaczające znaki.

To jest jak uruchomienie tego polecenia powłoki:

convert - -draw "'rectangle 0,0,100,100'" -

Próbować:

(call-process-region (point-min) (point-max) "convert" t t nil
                     "-" "-draw" "rectangle 0,0,50,50" "-")