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! > > [EMAIL PROTECTED]:~ -> 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: > > [EMAIL PROTECTED]:~ -> 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: > > [EMAIL PROTECTED]:~ -> 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: [EMAIL PROTECTED]:~ -> 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