Re: Standard-Fehlerausgabe pipen
Am Dienstag 05 September 2006 23:06 schrieb Martin Steigerwald:
> Am Dienstag 05 September 2006 21:29 schrieb Christian Paul:
> > Am Dienstag, 5. September 2006 12:40 schrieb Martin Steigerwald:
> > > Hallo,
> > >
> > > ich möchte gerne mit der Bash (3.1-5) die Standard-Fehler-Ausgabe
> > > eines Befehls pipen. Mein Ansatz ist:
> > >
> > > strace free 1>/dev/null | cat
> > >
> > > Doch das liefert nicht das gewünschte Ergebnis und sogar eine
> > > Fehlermeldung:
> >
> > [..]
> > Ich empfehle zur Lektüre:
> > http://www.thomashertweck.de/redir.html
> > hat mir zum Verständnis weitergeholfen.
>
> Hallo,
>
> vielen Dank für die ganzen Hinweise!
>
> martin@deepdance:~ -> strace free 2>test
> total used free shared buffers
> cached Mem: 775136 753772 21364 0 0
> 404264 -/+ buffers/cache: 349508 425628
> Swap: 979924 74992 904932
>
>
> Die vier Writes möchte ich haben:
>
> martin@deepdance:~ -> tail -n8 test
> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
> 0) = 0xb7f7b000
> write(1, " total used "..., 74) = 74
> write(1, "Mem: 775136 753772 "..., 74) = 74
> write(1, "-/+ buffers/cache: 349508 "..., 41) = 41
> write(1, "Swap: 979924 74992 "..., 41) = 41
> munmap(0xb7f7b000, 4096) = 0
> exit_group(0) = ?
> Process 3719 detached
>
>
> Genau das bekomme ich mit keiner dieser Varianten hin:
>
> strace free 2>&1 >/dev/null | tail -n8
> (strace free 1>/dev/null) 2>&1 | tail -n8
> strace free 2>&1 1>/dev/null | tail -n8
>
>
> Ich erhalte immer:
>
> martin@deepdance:~ -> strace free 2>&1 1>/dev/null | tail -n8
> read(3, "MemTotal: 775136 kB\nMemFre"..., 1023) = 598
> fstat64(1, {st_mode=S_IFCHR|0666, st_rdev=makedev(1, 3), ...}) = 0
> ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, 0xbff83c74) = -1 ENOTTY
> (Inappropriate ioctl for device)
> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
> 0) = 0xb7eea000
> write(1, " total used "..., 230) = 230
> munmap(0xb7eea000, 4096) = 0
> exit_group(0) = ?
> Process 6464 detached
>
> Da ist nur der erste Write und eben die Fehlermeldung zu dem
> ioctl-Call, der aber im der obigen test-Datei nicht ausgeführt wird.
>
>
> Tolle Kniffel-Aufgabe, oder? Komischerweise ging es einmal mit der
> letzten Variante, aber das konnte ich dann nicht reproduzieren...
>
> Ich glaub langsam, dass da strace einfach nicht mitspielt... vielleicht
> ist der ioctl von strace und nicht von free... Könnte das ein Bug sein?
> Oder einfach ein Nebeneffekt von strace? Meinungen?
Hallo nochmal,
also ich hab vermutet, dass es nicht geht, weil strace ein tty braucht und
dies nicht bekommt, wenn man /dev/null verwendet. Das könnte es sein:
"strace free 1>test" geht ohne Fehler, während "strace free 1>/dev/null"
den Fehler wirft.
Warum es dann nur noch ein write() ist, ist klar:
martin@deepdance:~ -> strace free 2>&1 | tail -n8
write(1, " total used "..., 230 total
used free shared buffers cached
Mem: 775136 754948 20188 0 0 405904
-/+ buffers/cache: 349044 426092
Swap: 979924 74912 905012
) = 230
munmap(0xb7f2b000, 4096) = 0
exit_group(0) = ?
Process 12573 detached
Bei Umleitung werden für printf (von free verwenndet) offenbar größere
Buffer verwendet und der ganze Text mit einem write()-Aufruf ausgegeben.
Was ja auch Sinn macht, wenn es nicht auf eine zeilenweise Aufgabe
ankommt. Wobei man den Unterschied wahrscheinlich nicht sehen kann.
Na, wieder was gelernt ;).
Grüße,
--
Martin 'Helios' Steigerwald - http://www.Lichtvoll.de
GPG: 03B0 0D6C 0040 0710 4AFA B82F 991B EAAC A599 84C7
Reply to: