Ανακατεύθυνση Εισόδου/Εξόδου

Εικόνα: markos
Submitted by markos on Κυρ, 04/03/2007 - 21:24

Κάθε εντολή ή πρόγραμμα που εκτελούμε χρησιμοποιεί κάποια πρότυπα αρχεία για επικοινωνία με το χρήστη. Συγκεκριμένα, ένα πρότυπο αρχείο εισόδου το οποίο μεταφέρει πληροφορίες από το χρήστη προς το πρόγραμμα και δύο πρότυπα αρχεία εξόδου που μεταφέρουν πληροφορίες από το πρόγραμμα προς το χρήστη. Το αρχείο εισόδου συναντάται πιο συχνά ως standard input ή stdin, ενώ τα αρχεία εξόδου ως standard output ή stdout και standard error ή stderr. Το πρότυπο αρχείο λαθών (stderr) υπάρχει για να μπορούμε να διαχωρίσουμε τις αμιγείς πληροφορίες του προγράμματος (δηλαδή αυτές που πραγματικά μας ενδιαφέρουν) από τα μηνύματα λάθους που πιθανόν να προκύψουν κατά την εκτέλεση του.

Τα πρότυπα αρχεία αποτελούν συμβολισμούς που κάθε φορά αντιστοιχούν σε πραγματικά αρχεία, όπως για παράδειγμα το τερματικό σας, ένα αρχείο στο δίσκο, μια σειριακή θύρα, μια απομακρυσμένη σύνδεση TELNET, κλπ. Αν φυσικά χρησιμοποιείτε την εντολή διαλεκτικά (interactively) σε ένα κέλυφος τα πρότυπα αρχεία αντιστοιχούν στην είσοδο και έξοδο του κελύφους (το πληκτρολόγιο και η οθόνη του τερματικού του κελύφους αντίστοιχα).

Πολλές φορές είναι χρήσιμο να μπορούμε να ανακατευθύνουμε την είσοδο ή την έξοδο από και προς κάποιο άλλο αρχείο αντίστοιχα. Για παράδειγμα, αν ένα πρόγραμμα μας ζητάει κάθε φορά να εισάγουμε αρκετές παραμέτρους, θα μας διευκόλυνε αρκετά να μπορούσαμε να καταγράψουμε αυτές τις παραμέτρους σε ένα αρχείο κειμένου για να το χρησιμοποιήσουμε ως είσοδο στο πρόγραμμα που εκτελούμε. Παρομοίως, ένα πρόγραμμα που παράγει μεγάλη ποσότητα πληροφορίας, μπορούμε να το κατευθύνουμε έτσι ώστε η πληροφορία να εξάγεται σε ένα αρχείο κειμένου για να την επεξεργαστούμε.
Ας υποθέσουμε ότι έχουμε ένα απλό πρόγραμμα στατιστικών το οποίο βγάζει τη μέση τιμή χρησιμοποιώντας τα στοιχεία που του δίνουμε στην είσοδο:

$ calcavg
Please enter data:
10.0
11.2
13.4
15.6
14.5
11.0
Average is = 12.62

Αν έχουμε κάνει κάποιο λάθος σε μία τιμή θα πρέπει να τις εισάγουμε ξανά όλες στο πρόγραμμα. Στο παράδειγμά μας η διπλή εισαγωγή στοιχείων δεν είναι και τόσο τραγικό γεγονός, αλλά υπάρχουν περιπτώσεις με χιλιάδες ή εκατομύρια πεδία όπου η εισαγωγή τους για δεύτερη φορά είναι μάλλον καταστροφή.

Ακριβώς για αυτόν το λόγο θα πρέπει να χρησιμοποιήσουμε την ανακατεύθυνση εισόδου. Έστω ότι κατασκευάζουμε ένα αρχείο κειμένου data.txt με τα περιεχόμενα των τιμών:

10.0
11.2
13.4
15.6
14.5
11.0

Τώρα αρκεί να εκτελέσουμε το πρόγραμμα calcavg χρησιμοποιώντας το data.txt ως είσοδο:

$ calcavg < data.txt
Please enter data:
Average is = 12.62

Με αυτόν τον τρόπο μπορούμε να διορθώσουμε, να προσθέσουμε ή να αφαιρέσουμε τιμές εύκολα. Αρκεί να εκτελέσουμε για δεύτερη φορά το πρόγραμμα για να έχουμε το αποτέλεσμα.

Η ανακατεύθυνση εξόδου λειτουργεί με παρόμοιο τρόπο. Ας υποθέσουμε ότι έχουμε μια λίστα ονομάτων σε ένα αρχείο names.txt την οποία θα θέλαμε να ταξινομήσουμε αλφαβητικά ως προς το επώνυμο (που στο αρχείο είναι η δεύτερη στήλη). Κάτι τέτοιο μπορεί πολύ ευκολα να γίνει με την εντολή sort. Συγκεκριμένα:

$ sort -k 2 names.txt

Η εντολή αυτή θα μας τυπώσει στην πρότυπη έξοδο (stdout) την ταξινομημένη λίστα των ονομάτων. Για να την ανακατευθύνουμε σε ένα αρχείο θα χρησιμοποιήσουμε το χαρακτήρα > :

$ sort -k 2 names.txt > sortednames.txt

Το αρχείο sortednames.txt περιέχει την επιθυμητή λίστα. (Σημείωση: η εντολή sort παρέχει μια επιλογή για απευθείας αποθήκευση των αποτελεσμάτων σε αρχείο, την -o/--output, που έχει το ίδιο αποτέλεσμα με την ανακατεύθυνση, βλ. σελ. ).
Στην περίπτωση που το αρχείο sortednames.txt προϋπάρχει, τα περιεχόμενά του θα αντικατασταθούν από τη νέα λίστα. Αν δε θέλουμε κάτι τέτοιο αλλά απλώς να προσθέσουμε μια νέα λίστα, θα πρέπει να χρησιμοποιήσουμε τους χαρακτήρες >>.

$ sort -k 2 names.txt >> sortednames.txt

Η ανακατεύθυνση του προτύπου αρχείου λαθών μπορεί να γίνει χρησιμοποιώντας το πρόθεμα 2 πριν το χαρακτήρα >. Δηλαδή η εντολή

$ command 2> errorfile

θα αποθηκεύσει πιθανά μηνύματα λάθους στο αρχείο errorfile. Αυτό είναι πολύ χρήσιμο ειδικά για προγράμματα που τρέχουν ως δαίμονες (daemons) και δεν είναι δυνατή η συνεχής παρακολούθησή τους σε ένα τερματικό.

Στο κέλυφος bash, είναι δυνατόν να ανακατευθύνουμε στο ίδιο αρχείο και το πρότυπο αρχείο εξόδου (stdout) και το πρότυπο αρχείο λαθών (stderr) χρησιμοποιώντας τη συντόμευση >&.

$ command >& logfile

0
Your rating: None