stdin/stderr redirections

Giorgos Keramidas keramida at ceid.upatras.gr
Tue Jul 10 14:01:02 EEST 2007


On 2007-07-10 13:03, Nick Demou <ndemou at gmail.com> wrote:
> θέλω να κάνω το παρακάτω μπερδεμένο redirection του output μιας εντολής (CMD):
>
> - το stdout ΚΑΙ το stderr της εντολής CMD να πάει στο αρχείο
> OutPlusErr.out αλλά να γίνει και apend στο αρχείο grant.log
> - το stderr της εντολής CMD να πάει στο Err.out
>
> ιδέες (ή ένα καλό reference για το πως ακριβώς λειτουργούν τα > >> >&
> | tee κτλ πριν κάνω 2000 δοκιμές)?

Μπορείς να κάνεις 'dup' ένα file descriptor, π.χ. με:

    exec 2>&3

αλλά δεν είναι εύκολο (χωρίς fork τουλάχιστον) να στείλεις το output
ενός file descriptor σε 2 file descriptors ταυτόχρονα.

Για παράδειγμα, μπορεί κάποιος αρχικά να σκεφτεί κάτι σαν:

    #!/bin/sh

    exec 2>&3               # dup2(stderr, fd[3])
    exec > kot.out 2>&1     # redirect both stdout & stderr
    exec 3> kot.err         # redirect original stderr

αλλά αυτό, δυστυχώς, σημαίνει πως οι εντολές όπως:

    echo foo >&2

δε θα στείλουν τίποτα στο fd 3 :-(

Θα χρειαστείς κάτι σαν fork() / pipe() και ένα child process που μπορεί
να στείλει το STDERR σε δυο μέρη ταυτόχρονα (δηλ. μια δική σου
mini-tee(1) σε Perl ή Python).




More information about the Linux-greek-users mailing list