Re: sed und regex

From: Bernd Walter <ticso(at)cicely12.cicely.de>
Date: Wed, 7 Jan 2004 06:56:14 +0100

On Wed, Jan 07, 2004 at 06:28:40AM +0100, Robert Barten wrote:
> On Wed, Jan 07, 2004 at 06:01:36AM +0100, Bernd Walter wrote:
> > On Wed, Jan 07, 2004 at 05:24:57AM +0100, Robert Barten wrote:
> > > On Wed, Jan 07, 2004 at 04:05:04AM +0100, Simon 'corecode' Schubert wrote:
> > > > >>das ist ja auch klar: die Shell macht die Umleitung auf `bar', und
> > > > >>zwar *bevor* sie cat ausfuehrt. Da ist dann die Datei schon
> > > > >>ueberschrieben.
> > >
> > > Das ist mir nicht klar. Die Ausgabe von cat wird durch die Pipe an sed
> > > übergeben. Je nach Komplexität braucht sed länger als das Pipen, bei mir
> > > in unserem Beispiel stets 99,5%. Ich habe keinen Unterschied zwischen
> > > CPU-Leistungen (3 versch.) festgestellt, die Proportionen cat/sed
> > > scheinen in diesem Beispiel wohl fast gleich zu sein. Gib cat etwas mehr
> > > zu tun (s/spam/spamassassin/), und Du kommst an die 100% ran. Wie auch
> > > immer, die Ausgabe von cat ist komplett an sed übergeben worden, nichts
> > > spricht dagegen, dass sed nun die Quelle überschreibt*.
> >
> > Doch - die Pipe als solches ist nichts weiter als eine Durchreiche mit
> > einem Puffer.
> > Die Puffergröße ist je nach OS und Version unterschiedlich.
> > Sobald du mehr Daten veschickst, als reinpasst wird gleichzeitig
> > gelesen und geschrieben.
> > Außerdem hast du absolut keine Garantie darüber ob zuerst gelesen oder
> > zuerst die Ausgabedatei geleert wird - eigendlich soll es ja gleich-
> > zeitig passieren, was die Frage nach der Reihenfolge eh verbietet.
>
> Deshalb macht die Shell auch keine Umleitung auf `bar', *bevor* sie cat
> ausführt.

Das ist albern - cat kann eine 100meg Datei nicht vollständig gelesen
haben, wenn am anderen Ende bereits geschrieben werden *muss*.
Es passt nur eine Systemabhängige endliche Menge an Daten in die Pipes.

Zu anderen startet deine Shell *möglicherweise* cat bevor diese die
Ausgabeumleitung macht, aber die Shell hat keine Ahnung davon, ob cat
zu diesem Zeitpunkt bereits die Datei geöffnet hat.
Es kann jederzeit passieren, daß cat blockiert (z.B. wegen swap) und
die CPU an die Shell zurückgegeben wird, welche dann das File vorher
leert.

Benenne die alte Datei vorher um und lösche diese nachher.
Dann klappt es auch in jeden Fall.

> > erleben können - laut Murphy wird es aber wenigstens lange genug
> > gutgehen, bis wichtige Daten betroffen sind.
>
> Ich bin auf einem SMP-System. Aber klare Sache, selbst 5 von 1000 sind 5
> zuviel. cat bar | ... > bar.neu && mv bar bar.alt && mv bar.neu bar - so,
> und nicht anders :)

Selbst 0 von 1000 sind zuviel, wenn die Möglichkeit besteht, dass der
beim Fall 1001 alles schief gehen kann.
So ein Kartenhaus kann jederzeit in sich zusammenfallen.
Man sollte sich nicht auf so einen Leichtsinn einlassen.

-- 
B.Walter                   BWCT                http://www.bwct.de
ticso(at)bwct.de                                  info(at)bwct.de
To Unsubscribe: send mail to majordomo.FreeBSD.org
with "unsubscribe de-bsd-questions" in the body of the message
Received on Wed 07 Jan 2004 - 06:59:03 CET

search this site