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

Re: Ausgabeumleitung funktioniert (mal wieder) nicht



On 09.11.05 15:27:36, Ulrich Fürst wrote:
> Andreas Pakulat <apaku@gmx.de> wrote: 
> > 
> > Genau das hatte Frank beschrieben, wenn auch nicht so richtig gut.
> > 2>&1 leitet stderr auf stdout um, was in dem Moment noch dein Terminal
> > ist. Erst danach leitest du stdout in eine Datei um. 
> 
> Eigentlich funktionieren die beiden redirects zeitgleich?

Nein ebend nicht.

> Wenn ja, warum macht die Reihenfolge dann einen Unterschied?

s.o.

> Wenn nein, dann dürfte sich der Unterschied doch eher auf millisekunden
> beschränken, so dass z.B. der erste Fehler, so er gleich am Anfang
> kommt, auf stdout ankommt und dann aber alles weiter doch in die Datei?

Aehm, _ich_ vermute ohne die Innereien der Bash zu kennen, das folgendes
passiert: 

Bash parst die Kommandozeile und stoest auf das Konstrukt "2>", sie
merkt das eine Umleitung sich anschliesst und liest alles bis zum
naechsten " " ein. Jetzt steht da &1, also eine Referenz auf stdout, die
Bash nimmt nun den Filedescriptor von stdout und erzeugt einen neuen
Filedescriptor fuer stderr der auf dasselbe Ziel zeigt (sprich das
Terminal), dann parst sie weiter und finde ">" oder "1>" und macht
dasselbe nochmal, nur diesmal erzeugt sie einen neuen Filedescriptor
fuer stdout der auf /dev/null zeigt. Der Filedescriptor von stderr zeigt
aber immernoch auf /dev/ttyX, nicht auf /dev/null, sprich du siehst alle
Fehlermeldungen, aber keine einzige von den normalen Ausgaben.

> > Aber das steht
> > auch in der manpage der Bash - "order matters".
> Ja, weiß ich, nur verstehe ich noch nicht ganz wie und warum.

s.o. stderr ist halt ein Filedescriptor auf die Datei auf die stdout 
vor seiner Umleitung gezeigt hat.

> Also, in "ls > dirlist 2>&1" sind zwei getrennte redirects. 
> Das "2>&1" leitet dabei stderr auf stdout um.
> in "ls 2>&1 > dirlist" sind ebenfalls zwei getrennte redirects.
> Aber das "2>&1" leitet nur eine Kopie um?

Nein, du musst bedenken, dass die Shell das parsen muss - was i.A. von
links nach rechts passiert, und dabei dann sequentiell die
Filedescriptoren von stdout und stderr aendern, wenn stderr vor stdout
geaendert wird zeigt es halt auf das "alte" stdout.

> Ist das so gedacht, das zwei identische Ausdrücke kontextabhängig
> verschiedenes tun? Oder hab' ich da immer noch einen Denk-Fehler?

Das steht in der Manpage und duerfte einfach am Parser der Shell liegen,
wenn der hier zuerst eine Umformung machen wuerde wuerde das klappen.

> P.S. Für mich klingt das so als wenn ich woanders rauskomme je nachdem,
> ob ich erst 2 Meter vor und dann 3 Meter zu Seite laufe oder
> umgekehrt?!? 

Der Vergleich hinkt.

Andreas

-- 
You're almost as happy as you think you are.



Reply to: