/ Forside / Teknologi / Operativsystemer / Linux / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Linux
#NavnPoint
o.v.n. 11177
peque 7911
dk 4814
e.c 2359
Uranus 1334
emesen 1334
stone47 1307
linuxrules 1214
Octon 1100
10  BjarneD 875
ImageMagick/Bash - double quotes forsvinde~
Fra : Lars Stokholm


Dato : 29-08-10 20:26

Jeg er ved at lave et script, men er stødt i et (tilbagevendende)
problem. Jeg kan koge det ned til dette:

LABEL="foo bar"
COMB="-background pink -fill blue label:\"$LABEL\""
convert $COMB test.png

Jeg får denne fejlmeddelelse:

convert: unable to open image `bar"': @ error/blob.c/OpenBlob/2514.
convert: no decode delegate for this image format `bar"' @
error/constitute.c/ReadImage/532.

Det svarer til at ImageMagick får kommandoen:

convert -background pink -fill blue label:foo bar test.png

Jeg har tjekket med et echo foran convert i scriptet foroven, men output
er som jeg forventede (nemlig med doublequotes):

convert -background pink -fill blue label:"foo bar" test.png

Hvis jeg kører denne kommando, så virker det fint. Det virker ret
mærkeligt og jeg er i tvivl om hvorvidt det er Bash eller convert der
fjerner mine double quotes.

Jeg har ikke mulighed for at gøre scriptet mere simpelt.

 
 
(Thorbjørn Ravn (29-08-2010)
Kommentar
Fra : (Thorbjørn Ravn


Dato : 29-08-10 20:44

Lars Stokholm <lars.stokholm@gmail.com> writes:

> COMB="-background pink -fill blue label:\"$LABEL\""

Så overlever gåseøjnene ind i COMB, som du også har set.

Det du har brug for er formentlig at også få to backslashes med ind i
COMB.

Prøv med

label:\\\"$LABEL\\\""
--
Thorbjørn Ravn Andersen "... plus... Tubular Bells!"

Martin Larsen (29-08-2010)
Kommentar
Fra : Martin Larsen


Dato : 29-08-10 20:58

Lars Stokholm wrote:

> LABEL="foo bar"
> COMB="-background pink -fill blue label:\"$LABEL\""
> convert $COMB test.png

Prøv at veksle mellem enkelt- og dobbelapostroffer, fx:

LABEL="foo bar"
COMB="-background pink -fill blue label:'$LABEL'"
convert $COMB test.png


Lars Stokholm (29-08-2010)
Kommentar
Fra : Lars Stokholm


Dato : 29-08-10 21:41

Thorbjørn Ravn Andersen, 20100829 wrote:
> Det du har brug for er formentlig at også få to backslashes med ind i
> COMB.
>
> Prøv med
>
> label:\\\"$LABEL\\\""

Det virker heller ikke. Jeg har prøvet før og nu igen.

Lars Stokholm (29-08-2010)
Kommentar
Fra : Lars Stokholm


Dato : 29-08-10 21:42

Martin Larsen wrote:
> Prøv at veksle mellem enkelt- og dobbelapostroffer, fx:
>
> LABEL="foo bar"
> COMB="-background pink -fill blue label:'$LABEL'"
> convert $COMB test.png

Det har jeg desværre også prøvet - til jeg blev helt blå i hovedet. Jeg
har brugt mindt en time på at sidde og rodde med det.

Martin Larsen (29-08-2010)
Kommentar
Fra : Martin Larsen


Dato : 29-08-10 22:53

Lars Stokholm wrote:

> Det har jeg desværre også prøvet - til jeg blev helt blå i hovedet. Jeg
> har brugt mindt en time på at sidde og rodde med det.

Får du kun fejlen når der er mellemrum i LABEL?

I så fald kunne du prøve

LABEL="foo\ bar"

Benny Amorsen (29-08-2010)
Kommentar
Fra : Benny Amorsen


Dato : 29-08-10 22:15

Lars Stokholm <lars.stokholm@gmail.com> writes:

> Jeg er ved at lave et script, men er stødt i et (tilbagevendende)
> problem. Jeg kan koge det ned til dette:
>
> LABEL="foo bar"
> COMB="-background pink -fill blue label:\"$LABEL\""
> convert $COMB test.png
>
> Jeg får denne fejlmeddelelse:
>
> convert: unable to open image `bar"': @ error/blob.c/OpenBlob/2514.
> convert: no decode delegate for this image format `bar"' @
> error/constitute.c/ReadImage/532.
>
> Det svarer til at ImageMagick får kommandoen:
>
> convert -background pink -fill blue label:foo bar test.png

Nej, det svarer til at ImageMagic får kommandoen
convert -background pink -fill blue label:"foo bar" test.png
hvor shell'en ikke har fjernet anførselstegn. Det vil ikke virke, for så
leder convert efter en fil ved navn bar" (og en label ved navn "foo er
også lidt suspekt).

> Jeg har tjekket med et echo foran convert i scriptet foroven, men output
> er som jeg forventede (nemlig med doublequotes):
>
> convert -background pink -fill blue label:"foo bar" test.png
>
> Hvis jeg kører denne kommando, så virker det fint. Det virker ret
> mærkeligt og jeg er i tvivl om hvorvidt det er Bash eller convert der
> fjerner mine double quotes.

Jeg kan ikke komme på en metode til at gøre det du ønsker. En variabel,
der indeholder en værdi med mellemrum, kan enten blive opfattet som kun
1 værdi, og så får du:

convert: unrecognized option `-background pink -fill blue label:foo bar' @ convert.c/ConvertImageCommand/802.

Eller du kan lade din shell opdele efter mellemrum, men så opdeler den
efter alle mellemrum.

I perl er det relativt let, f.eks. ved at lade COMB være et array i
stedet for en streng, eller ved kreativ brug af split. Det burde faktisk
også kunne gøres med arrays i bash, men når jeg når til arrays skifter
jeg altid til perl.


/Benny


Lars Stokholm (30-08-2010)
Kommentar
Fra : Lars Stokholm


Dato : 30-08-10 06:28

Martin Larsen wrote:
> Får du kun fejlen når der er mellemrum i LABEL?
>
> I så fald kunne du prøve
>
> LABEL="foo\ bar"

Det har jeg desværre også prøvet.

Martin Larsen (30-08-2010)
Kommentar
Fra : Martin Larsen


Dato : 30-08-10 07:49

Dette virker i al fald på min PC:

LABEL="foo bar"
COMB="-background pink -fill blue label:\"$LABEL\""
sh -c "convert $COMB test.png"


Lars Stokholm (30-08-2010)
Kommentar
Fra : Lars Stokholm


Dato : 30-08-10 06:31

Benny Amorsen wrote:
>> Det svarer til at ImageMagick får kommandoen:
>>
>> convert -background pink -fill blue label:foo bar test.png
>
> Nej, det svarer til at ImageMagic får kommandoen
> convert -background pink -fill blue label:"foo bar" test.png
> hvor shell'en ikke har fjernet anførselstegn. Det vil ikke virke, for så
> leder convert efter en fil ved navn bar" (og en label ved navn "foo er
> også lidt suspekt).

Hvorfor vil det ikke virke? Det er måske slet ikke meningen at convert
skal se anførselstegnene? - er det for Bash's skyld at de er der?

> I perl er det relativt let, f.eks. ved at lade COMB være et array i
> stedet for en streng, eller ved kreativ brug af split. Det burde faktisk
> også kunne gøres med arrays i bash, men når jeg når til arrays skifter
> jeg altid til perl.

Altså LABEL=( foo bar ) ?

Klaus Alexander Seis~ (30-08-2010)
Kommentar
Fra : Klaus Alexander Seis~


Dato : 30-08-10 06:37

Lars Stokholm skrev:

> LABEL="foo bar"
> COMB="-background pink -fill blue label:\"$LABEL\""
> convert $COMB test.png

Fungerer det mon med

LABEL="foo bar"
COMB=$(eval echo '-background pink -fill blue label:\"$LABEL\"')
convert "$COMB" test.png

?

Mvh,

--
Klaus Alexander Seistrup
http://klaus.seistrup.dk/

Lars Stokholm (30-08-2010)
Kommentar
Fra : Lars Stokholm


Dato : 30-08-10 06:46

Klaus Alexander Seistrup wrote:
> Fungerer det mon med
>
> LABEL="foo bar"
> COMB=$(eval echo '-background pink -fill blue label:\"$LABEL\"')
> convert "$COMB" test.png

Desværre ikke:

convert: unrecognized option `-background pink -fill blue label:"foo
bar"' @ error/convert.c/ConvertImageCommand/815.

(Thorbjørn Ravn (30-08-2010)
Kommentar
Fra : (Thorbjørn Ravn


Dato : 30-08-10 07:57

Lars Stokholm <lars.stokholm@gmail.com> writes:

> convert: unrecognized option `-background pink -fill blue label:"foo
> bar"' @ error/convert.c/ConvertImageCommand/815.

Du får sendt hele strengen fra -background til bar som ET argument. Det
er _DET_ der er dit problem.
--
Thorbjørn Ravn Andersen "... plus... Tubular Bells!"

Lars Stokholm (30-08-2010)
Kommentar
Fra : Lars Stokholm


Dato : 30-08-10 14:12

Martin Larsen wrote:
> Dette virker i al fald på min PC:
>
> LABEL="foo bar"
> COMB="-background pink -fill blue label:\"$LABEL\""
> sh -c "convert $COMB test.png"

Woohoo! Det ledte mig da i den rigtige retning. Jeg synes dog dette er
lidt kønnere:

eval convert $COMB test.png

Men mange tak!

Benny Amorsen (30-08-2010)
Kommentar
Fra : Benny Amorsen


Dato : 30-08-10 19:26

Lars Stokholm <lars.stokholm@gmail.com> writes:

> Hvorfor vil det ikke virke? Det er måske slet ikke meningen at convert
> skal se anførselstegnene? - er det for Bash's skyld at de er der?

Korrekt. convert må ikke se dem, convert parser ikke kommandolinjen men
æder bare hvad bash giver den. Der er kun nogle enkelte Unix-kommandoer,
der laver parsing af anførselstegn osv., og convert er ikke en af dem.


/Benny


Lars Stokholm (30-08-2010)
Kommentar
Fra : Lars Stokholm


Dato : 30-08-10 19:47

Benny Amorsen wrote:
> Korrekt. convert må ikke se dem, convert parser ikke kommandolinjen men
> æder bare hvad bash giver den. Der er kun nogle enkelte Unix-kommandoer,
> der laver parsing af anførselstegn osv., og convert er ikke en af dem.

Så lærte man også det. :) Jeg havde en uudtalt forståelse af, at en
kommando bare åd alt hvad der stod bag den. Men i det lys kan jeg godt
se at shell expansion ville være det rene magi.

Kent Friis (30-08-2010)
Kommentar
Fra : Kent Friis


Dato : 30-08-10 19:59

Den Mon, 30 Aug 2010 20:46:56 +0200 skrev Lars Stokholm:
> Benny Amorsen wrote:
>> Korrekt. convert må ikke se dem, convert parser ikke kommandolinjen men
>> æder bare hvad bash giver den. Der er kun nogle enkelte Unix-kommandoer,
>> der laver parsing af anførselstegn osv., og convert er ikke en af dem.
>
> Så lærte man også det. :) Jeg havde en uudtalt forståelse af, at en
> kommando bare åd alt hvad der stod bag den. Men i det lys kan jeg godt
> se at shell expansion ville være det rene magi.

I *nix er det shell'en der håndterer quotes, wildcards, osv. Derfor
virker det med alle programmer.

I MS-DOS og efterfølgere, er det det enkelte programs opgave. Derfor
virker fx "type *.txt" ikke. Type kan nemlig ikke håndtere wildcards.

Mvh
Kent
--
"The Brothers are History"

Søg
Reklame
Statistik
Spørgsmål : 177577
Tips : 31968
Nyheder : 719565
Indlæg : 6409071
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste