sed, eval, Leerzeichen einfügen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
ren22

sed, eval, Leerzeichen einfügen

Beitrag von ren22 » 26.10.2014 16:54:19

Hi,

ich möchte gerne mit sed eine Datei editieren aber ich bekomme es nicht hin das auch ein Leerzeichen mit geschrieben wird, sobald ich ein Leerzeichen nach der Raute,Punkt: "#. /usr/local/etc/xen/scripts/hotplugpath" hinzufüge bekomme ich immer
./rrr-evaltest.sh: line 9: /usr/local/etc/xen/scripts/hotplugpath#g /tmp/xen4-tools/usr/local/etc/init.d/xencommons: No such file or directory
, ohne Leerzeichen nachdem Raute,Punkt klappt es aber ich brauche auch das Leerzeichen dazwischen xd :D

das ganze läuft wie folgt:
ein/e bash Datei/Script "rrr-evaltest.sh" liest die rrr-evalconf Datei aus, wo der Wert,(bzw. das Kommando), für den "eval" Befehl drinne steht und der dann ausgeführt werde soll von der/dem rrr-evaltest.sh Datei/Script.

rrr-evalconf

Code: Alles auswählen

WORKAROUNDAFTER="sed -i "s#\.[[:space:]]*/etc/xen/scripts/hotplugpath#. /usr/local/etc/xen/scripts/hotplugpath#g" /tmp/xen4-tools/usr/local/etc/init.d/xencommons"
rrr-evaltest.sh

Code: Alles auswählen

#!/bin/bash

set -x
if grep -qw "^WORKAROUNDAFTER=" rrr-evalconf 2>/dev/null ; then
    echo -n "${BLUE}trying to apply ${MAGENTA}WORKAROUNDAFTER${BLUE} ...${NORMAL}"
    while read line; do

if [ "$line" != "" ] && [ "$line" == "$(echo $line | grep "^WORKAROUNDAFTER=")" ]; then
    eval $line ; $(echo $WORKAROUNDAFTER)
fi
done < rrr-evalconf

fi
auszug aus der xencommons Datei

Code: Alles auswählen

XENSTORED=/usr/local/sbin/xenstored
BACKEND_MODULES="xen-evtchn xen-gntdev xen-gntalloc xen-blkback xen-netback xen-pciback evtchn gntdev netbk blkbk xen-scsibk usbbk pc

. /etc/xen/scripts/hotplugpath.sh

if [ -d /etc/sysconfig ]; then
xencommons_config=/etc/sysconfig
so sieht mein Ergebnis in der xencommons bisher aus:
./usr/local/etc/xen/scripts/hotplugpath.sh
aber stehen in der xencommon soll (punkt leerfeld slash) anstatt (punkt slash)
. /usr/local/etc/xen/scripts/hotplugpath.sh
vielleich weiß ja der ein oder andere wo mein Fehler liegt. Ich hoffe ich habe das ein wenig verständlich oben beschrieben :)

vielen Dank
ren22

Benutzeravatar
Meillo
Moderator
Beiträge: 9237
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: sed, eval, Leerzeichen einfügen

Beitrag von Meillo » 26.10.2014 21:33:38

ren22 hat geschrieben: rrr-evalconf

Code: Alles auswählen

WORKAROUNDAFTER="sed -i "s#\.[[:space:]]*/etc/xen/scripts/hotplugpath#. /usr/local/etc/xen/scripts/hotplugpath#g" /tmp/xen4-tools/usr/local/etc/init.d/xencommons"
Ohne tiefer nachgeschaut zu haben: Hast du dir in `rrr-evalconf' mal die Anfuehrungsstriche angeschaut? Was ist denn dort wie gequoted? Dann wirst du schnell feststellen, dass ein Leerzeichen im nicht-gequoteten (!) Teil natuerlich den einen String in zwei teilt. ;-)

Tipp: Entweder die inneren Doublequotes escapen oder Singlequotes in Doublequotes schachteln.


btw: Eval ist meist evil. Speichere dir lieber die Regexp in der ersten Zeile und den Ersatztext in der zweiten Zeile der Conf-Datei und bau den Befehl dann danach im Script zusammen.
Use ed once in a while!

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: sed, eval, Leerzeichen einfügen

Beitrag von Cae » 27.10.2014 00:06:18

Ich wuerde ja den recht ekligen eval-Teil komplett rauslassen und in der Konfiguration dann ein Skript referenzieren (was neben der Konfig in /etc/ liegt und dafuer gedacht ist, vom Benutzer veraendert zu werden). Dieses Skript wird dann ge-source-t, d.h. der enthaltene Code wird so ausgefuehrt, als haette er von Anfang an im Haupskript anstelle von source gestanden.

Im Uebrigen benutzt du da feste Pfade in /tmp/ (/tmp/xen3-tools/...), was keine gute Idee ist, weil dadurch Symlink-Angriffe moeglich werden. Verwende stattdessen mktemp, vielleicht in einem wartungsfreien Konstrukt wie

Code: Alles auswählen

t="$(mktemp -d)"
trap "rm -r $t" INT EXIT

tar xf some.tar -C "$t" # etc.
-- da wird ein temporaeres Verzeichnis $t angelegt mit unerratbarem Namen, welches ueber eine trap ("Falle", eher "Trigger") beim ^C (INT) oder bei Skriptende (EXIT) automatisch wieder entfernt wird.

Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

Antworten