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: