[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Seltsames Verhalten von echo


Markus Demleitner schrieb am 20.05.2011 08:03:

> richtige Frage: "*Welches* echo verhaelt sich, na ja, komisch?".
> 
> Waehrend naemlich echo (1), also in der Regel /bin/echo in der Manpage
> sagt
> 
>      -E     disable interpretation of backslash escapes (default)
> 
> ist das, was du bekommst, wenn du dein Skript so schreibst, wie du es
> schreibst, das bash-builtin.  Ueber das erfaehrt man in help echo:
> 
Es ist definitiv ein Quoting Problem und es wird auch ziemlich sicher das
bash-builtin verwendet - ausser Du hast im Script ein echo definiert, aber
danach sieht es nicht aus.
Ansonsten gilt immer folgende Reihenfolge:

shell-builtin > Alias > Binary (je nach PATH-Reihenfolge)

Wenn du es genau wissen willst, dann liefert dir das der Befehl "type echo".
Hier ein kleines Beispiel dazu:

$  type echo; alias echo='/bin/echo'; type echo; unalias echo; type echo
echo is a shell builtin
echo ist ein Alias von `/bin/echo'.
echo is a shell builtin

> Es gibt viele Moeglichkeiten, das zu fixen (%s#echo#/bin/echo im vi
> ist eine davon), aber ich wuerde wahrscheinlich zu einem Here-document
> raten, so wie das gemacht ist.
> 
Du koenntest also zuerst mal versuchen alle echo-Aufrufe in deinem Script durch
"echo -E" zu ersetzen.

Da in den Beispiel bei den viele Zeilen fast alles bleiben soll wie es ist und
nur in einer Zeile variabler Text ($1) auftaucht wuerde ich auch das
Here-Dokument oder gleich ein externes File mit dem Text erstellen, dort einen
Platzhalter (z. B. "_TEXT1_") einbauen und nur diesen mit sed durch den Inhalt
von $1 ersetzen lassen. Also etwa so:

TEXTEMPLATE="create.tpl"
CREATETEX="create.tex"

createtitle()
{
cat $TEXTEMPLATE | sed ...
}

> Aber zwecks due diligence: Shellskripts als CGI-Backends verlangen
> viel Sorgfalt bei der Input-Validierung, und wenn du Eingaben aus dem
> Netz in TeX uebernimmst, solltest du dran denken, dass TeX
> Turing-vollstaendig ist und Zugriff auf dein Dateisystem hat.
> 
FULL ACK!
Wenn das wirklich von Webserver aufgerufen wird, dann wuerde ich lieber
versuchen das durch Systemaufrufe in PHP direkt zu handlen oder noch besser
das Ganze mit Perl abbilden.

Gruss Tom

-- 
UUGRN e.V. http://www.uugrn.org/
http://mailman.uugrn.org/mailman/listinfo/uugrn
Wiki: https://wiki.uugrn.org/UUGRN:Mailingliste
Archiv: http://lists.uugrn.org/