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

Re: Standard-Fehlerausgabe pipen



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?

Denn so gehts:

martin@deepdance:~ -> cat ausgabe.sh
#!/bin/bash
echo "Dies ist eine Ausgabe auf stdout." >&1
echo "Dies ist eine Ausgabe auf stderr." >&2
martin@deepdance:~ -> ./ausgabe.sh 2>/dev/null
Dies ist eine Ausgabe auf stdout.
martin@deepdance:~ -> (./ausgabe.sh 1>/dev/null) 2>&1
Dies ist eine Ausgabe auf stderr.
martin@deepdance:~ -> ./ausgabe.sh 2>&1 1>/dev/null
Dies ist eine Ausgabe auf stderr.
martin@deepdance:~ -> ./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



Reply to: