[SOLVED] stdin/stderr redirections

ndemou at gmail.com ndemou at gmail.com
Thu Jul 12 10:30:35 EEST 2007


μία "απλή" λύση σε bash είναι αυτή:
==========================
(./cmd.sh 3>&1 1>&2 2>&3 | tee err.out) 2>&1 | tee both.log >> grant.log

 * δεν έψαξα το zsh γιατί δεν το ξέρω καθόλου
 * δεν προσπάθησα να το κάνω σε python όπου θα ήταν πιο κατανοητό για
όποιον ξέρει έστω και μία γλώσσα προγραμματισμού. Οι λόγοι είναι πως
θα ήταν σίγουρα ΠΟΛΥ μεγαλύτερο και αργό και πως εν το μεταξύ βρήκα
σχεδόν έτοιμη την λύση στο web[1] και απλά έπρεπε να αποκρυπτογραφήσω
τα ωραία συμβολάκια του bash και αφού τα καταλάβω να τα προσαρμόζω
στην περίπτωση μου.

η εξήγηση είναι αυτή:
==========================
(πρέπει να ξέρετε τι είναι stdin, stdout, stderr - αν δεν ξέρετε εδώ
[2] έχει ωραίες εικονίτσες)

αυτό:
    SomeCmd | SomeOtherCmd
προκαλεί την προώθηση *MONO* του stdout του SomeCmd στο stdin του SomeOtherCmd

αυτό
    tee file
οδηγεί την stdin του tee  αφενός απευθείας στο stdout και αφετέρου στο
αρχείο file

αυτό:
   something  2>&1
οδηγεί ότι πάει στο file descriptor 2 (δηλ. τo stderr) προς τον file
descriptor 1 (δηλαδή το stdout)

αυτό:
   somemore >> file
κάνει append το stdout του somemore στο αρχείο file

αυτό:
    cmd 3>&1 1>&2 2>&3
προκαλεί την αντιμετάθεση του stdin, stdout
(για να γίνει κατανοητό πρέπει να το κάνετε interpret απο το *τέλος
προς την αρχή* - δηλ:
α. οδήγησε ότι πάει στο file descriptor 2 (αυτή τη στιγμή πάνε τα
error messages) προς τον file descriptor 3
β. οδήγησε ότι πάει στο file descriptor 1 (αυτή τη στιγμή πάνε τα
standard messages) προς τον file descriptor 2
γ. οδήγησε ότι πάει στο file descriptor 3 (δηλαδή τα error messages
που έχουν φτάσει εδώ απο το πρώτο βήμα) προς τον file descriptor 1
οπότε τελικά αυτό που πήγαινε στο fd1 πάει στο fd2 και τανάπαλιν.
Προσοχή: η σειρά που εμφανίζονται τα x>&y παίζει όντως ρόλο όπως
φαίνεται και στην σειρά του interpretation παραπάνω)


η δοκιμή είναι αυτή:
==========================
# cat > cmd.sh ; chmod u+x cmd.sh
#!/bin/bash
echo "This is an ERROR line" >&2
echo "This is a STDOUT line"

# ./cmd.sh
This is an ERROR line <--- stderr
This is a STDOUT line <--- stdout

# ./cmd.sh 3>&1 1>&2 2>&3
This is an ERROR line  <--- stdout
This is a STDOUT line   <--- stderr

# ./cmd.sh 3>&1 1>&2 2>&3 | tee err.out
This is a STDOUT line
This is an ERROR line
# cat err.out
This is an ERROR line

# (./cmd.sh 3>&1 1>&2 2>&3 | tee err.out) 2>&1 | tee both.log
This is a STDOUT line
This is an ERROR line
# cat both.log
This is a STDOUT line
This is an ERROR line

# rm err.out both.log
# (./cmd.sh 3>&1 1>&2 2>&3 | tee err.out) 2>&1 | tee both.log >> grant.log
# (./cmd.sh 3>&1 1>&2 2>&3 | tee err.out) 2>&1 | tee both.log >> grant.log
# cat grant.log
This is an ERROR line
This is a STDOUT line
This is a STDOUT line
This is an ERROR line
# cat err.out
This is an ERROR line
# cat both.log
This is a STDOUT line
This is an ERROR line


_________________
[1] http://www.cpqlinux.com/redirect.html
[2] http://www.ibm.com/developerworks/aix/library/au-unix-commandline/index.html




More information about the Linux-greek-users mailing list