• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

(gelöst)Ausrufezeichen in ImageMagick maskieren

Ich versuche mit ImageMagick einen Text in ein Bild einzufügen

Code:
convert -pointsize 600 -fill green -gravity South -draw "text 10,20 'Danke'" in.jpg out.jpg
gibt erwartungsgemäß „Danke“ als Text im Bild
Code:
convert -pointsize 600 -fill green -gravity Sout -draw "text 10,20 'Danke !'" in.jpg out.jpg

gibt:

Code:
fehler bash: !'": event not found

Code:
convert -pointsize 600 -fill green -gravity Sout -draw "text 10,20 'Danke \!'" in.jpg out.jpg

gibt „Danke \!“ als Text im Bild

wie muss ich das Ausrufezeichen maskieren? Stehe momentan auf dem Schlauch

Gruß LB
 

uhelp

Member
Das Ausrufezeichen ist ein Trigger für die Historyexpansion.
Die kannst du mit single quotes oder mit Backslash maskieren.

Da innerhalb von double quotes ein single quote ein ganz normales Zeichen ist,
maskieren die single quotes innerhalb eben nicht.

Dreh es einfach rum:
Code:
convert -pointsize 600 -fill green -gravity South -draw 'text 10,20 "Danke !" ' in.jpg out.jpg
Oder maskiere das Ausrufezeichen mit einem Backslash davor.
 
Danke! Das hat mein Problem gelöst.
Zum besseren Verständnis würde ich gern noch wissen warum im letzten Beispiel von mir der Backslash mit dem Ausrufezeichen zusammen ausgegeben wird.
L.B.
 

marce

Guru
Du sagst sozusagen explizit, es soll 'Danke \!' ausgegeben werden - durch die ' werden die (bzw. ein Teil der sonst) üblichen Quotierungs und Escape-Regeln außer Kraft gesetzt. Der entsprechenden Part in der Doku müsste ich noch suchen, wo genau steht was wann wie erhalten bleibt und was nicht...
 

uhelp

Member
Das Quoten hat abgesehen von Tücken, die hier zutage treten, noch ganz andere Probleme.
So muss man höllisch aufpassen, will man kompatible Scripte für viele verschiedene Systeme schreiben.
Zudem soll in Bash 4.3 jetzt ein leicht anderes Verhalten eingeführt worden sein.
(Was ich mit noch nicht angeguckt habe.)
Man sollte verrückte Quotingarien vermeiden.

Zurück zum Thema.
Die Regeln für double quotes aus der Bash Manpage:
Enclosing characters in double quotes (‘"’) preserves the literal value of all characters within the quotes, with the exception of ‘$’, ‘`’, ‘\’, and, when history expansion is enabled, ‘!’. The characters ‘$’ and ‘`’ retain their special meaning within double quotes (see Shell Expansions). The backslash retains its special meaning only when followed by one of the following characters: ‘$’, ‘`’, ‘"’, ‘\’, or newline. Within double quotes, backslashes that are followed by one of these characters are removed. Backslashes preceding characters without a special meaning are left unmodified. A double quote may be quoted within double quotes by preceding it with a backslash. If enabled, history expansion will be performed unless an ‘!’ appearing in double quotes is escaped using a backslash. The backslash preceding the ‘!’ is not removed.
Quasi ein Radio Eriwan Verhalten: Im Prinzip ja, aber...
Falls es tröstet: Diese Sonderregelung gilt nur für die History Expansion.
Die ist ja im Parsing-Prozess der Bash auch ein eigener Schritt, was die Sache etwas verständlicher machen mag.

Man könnte solche Probleme umgehen, indem man schlicht die Historyexpansion abschaltet:
Code:
set +H
(Viele Leute, die ihre Tasten selbst zu belegen pflegen, schalten sie ab, weil man da allzuleicht ein falsches Kommando aufruft)
 
Da habe wieder etwas dazu gelernt. Und so soll es ja sein!
Wenn man wie ich nur sporadisch mit der Bash arbeitet, kann einem so etwas reichlich Zeit fressen.
L.B.
 
Oben