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?

Denn so gehts:

[EMAIL PROTECTED]:~ -> cat ausgabe.sh
#!/bin/bash
echo "Dies ist eine Ausgabe auf stdout." >&1
echo "Dies ist eine Ausgabe auf stderr." >&2
[EMAIL PROTECTED]:~ -> ./ausgabe.sh 2>/dev/null
Dies ist eine Ausgabe auf stdout.
[EMAIL PROTECTED]:~ -> (./ausgabe.sh 1>/dev/null) 2>&1
Dies ist eine Ausgabe auf stderr.
[EMAIL PROTECTED]:~ -> ./ausgabe.sh 2>&1 1>/dev/null
Dies ist eine Ausgabe auf stderr.
[EMAIL PROTECTED]:~ -> ./ausgabe.sh 1>/dev/null 2>&1

Nur die letzte Variante geht nicht, was anhand der von Dir empfohlenen 
Lektüre verständlich ist.

Grüße,
-- 
Martin 'Helios' Steigerwald - http://www.Lichtvoll.de
GPG: 03B0 0D6C 0040 0710 4AFA  B82F 991B EAAC A599 84C7

Antwort per Email an