Εάν η έξοδος στην (γραφική) κονσόλα δεν είναι πολύ μεγάλη, μπορείτε απλά να επιλέξετε ένα κομμάτι με το ποντίκι και να το επικολλήσετε στο μήνυμα κάνοντας κλικ στο μεσαίο κουμπί. Διαφορετικά, μπορείτε να χρησιμοποιήσετε την ανακατεύθυνση εξόδου σε ένα αρχείο μέσω μιας "χοάνης", όπως αυτό:

Παράμετροι Some_command > logfile.txt

Για να δείτε το αποτέλεσμα της εκτέλεσης στην οθόνη και ταυτόχρονα να γράψετε σε ένα αρχείο, μπορείτε να χρησιμοποιήσετε την εντολή tee:

Παράμετροι Some_command | tee -a logfile.txt

Η εντολή setterm -dump δημιουργεί ένα στιγμιότυπο της τρέχουσας προσωρινής μνήμης εικονικής κονσόλας ως αρχείο απλού κειμένου με το προεπιλεγμένο όνομα screen.dump. Μπορείτε να χρησιμοποιήσετε τον αριθμό της κονσόλας για την οποία θέλετε να κάνετε απόρριψη ως όρισμα. Και η προσθήκη της επιλογής -filename file θα ανακατευθύνει αυτήν την ένδειξη σε ένα αρχείο με το καθορισμένο όνομα. Η επιλογή -append θα προσαρτήσει τη νέα ένδειξη σε ένα υπάρχον αρχείο - το "default" screen.dump ή ένα με το όνομα της επιλογής -file.

Εκείνοι. μετά τη χρήση της εντολής όπως

Setterm -dump -file /root/screenlog

αντίστοιχα στο αρχείο /root/screenlogθα είναι το περιεχόμενο μιας σελίδας κονσόλας.

Βρήκε μια άλλη λύση για την αντιγραφή/επικόλληση κειμένου σε μια κονσόλα κειμένου χωρίς ποντίκι. Μπορείτε επίσης να αντιγράψετε κείμενο από την προσωρινή μνήμη κύλισης (δηλαδή τα πάντα στην οθόνη και πάνω από την οθόνη). Για καλύτερη κατανόηση, διαβάστε σχετικά με την οθόνη διαχείρισης παραθύρων που βασίζεται σε κονσόλα . Μπορεί επίσης να είναι χρήσιμο να αυξήσετε το μέγεθος του buffer κύλισης.

1) Εκτέλεση οθόνης

2) Πατήστε Enter. Τα παντα. Βρισκόμαστε στο παράθυρο της κονσόλας μηδέν.

3) Εκτελούμε τις απαραίτητες εντολές, η έξοδος των οποίων πρέπει να αντιγραφεί.

4) Ctrl+A, Ctrl+[ - είμαστε σε λειτουργία αντιγραφής. Βάζουμε τον κέρσορα στην αρχή της επιλογής, πατάμε το πλήκτρο διαστήματος, μετά βάζουμε τον κέρσορα στο τέλος της επιλογής, πατάμε το πλήκτρο διαστήματος. Το κείμενο αντιγράφηκε στο πρόχειρο.

5) Ctrl+A, c - δημιουργήσαμε ένα νέο 1ο παράθυρο.

6) Ctrl+A, 1 - μεταβήκαμε στο 1ο παράθυρο.

7) Ανοίξτε οποιοδήποτε (?) πρόγραμμα επεξεργασίας κειμένου (δοκίμασα στο mc) και πατήστε Ctrl + A, Ctrl +] - το κείμενο εισάγεται. Αποταμιεύουμε.

8) Ctrl+A, Ctrl+0 - επιστρέψτε στο παράθυρο μηδέν.

Πώς να αυξήσετε την προσωρινή μνήμη κύλισης;

Η πρώτη λύση είναι να αυξήσετε το προεπιλεγμένο (προεπιλεγμένο) μέγεθος buffer στις πηγές του πυρήνα και να το μεταγλωττίσετε ξανά. Επιτρέψτε μου να υποθέσω ότι είστε τόσο απρόθυμοι να το κάνετε αυτό όσο εγώ και αναζητήστε ένα πιο ευέλικτο μέσο.

Και υπάρχει ένα τέτοιο εργαλείο, αλλά ονομάζεται framebuffer κονσόλα, fbcon για συντομία. Αυτή η συσκευή διαθέτει αρχείο τεκμηρίωσης fbcon.txt; αν εγκαταστήσατε την τεκμηρίωση για τον πυρήνα, τότε την έχετε. Ψάξτε το κάπου τριγύρω /usr/shareκλάδους (δεν μπορώ να δώσω την ακριβή διαδρομή λόγω διαφορών στις κατανομές).

Σε αυτό το σημείο, ζητώ συγγνώμη: πρέπει να απομακρυνθούμε λίγο και να μιλήσουμε λίγο για το buffer βίντεο ( framebuffer ).

Το buffer βίντεο είναι ένα buffer μεταξύ της οθόνης και του προσαρμογέα βίντεο. Η ομορφιά του είναι ότι μπορεί να χειριστεί: επιτρέπει κόλπα που δεν θα λειτουργούσαν εάν ο προσαρμογέας συνδεόταν απευθείας στην οθόνη.

Ένα τέτοιο κόλπο σχετίζεται με την προσωρινή μνήμη κύλισης. αποδεικνύεται ότι μπορείτε να "ζητήσετε" από την προσωρινή μνήμη βίντεο να εκχωρήσει περισσότερη μνήμη στην προσωρινή μνήμη κύλισης. Αυτό επιτυγχάνεται μέσω των παραμέτρων εκκίνησης του πυρήνα. Πρώτα απαιτείτε framebuffer(buffer βίντεο) Στη συνέχεια, ζητάτε ένα μεγαλύτερο buffer κύλισης.

Το παρακάτω παράδειγμα είναι για το GRUB, αλλά μπορεί εύκολα να προσαρμοστεί στο LILO. Στο αρχείο διαμόρφωσης GRUB - μενού.lst- βρείτε τη γραμμή που αντιστοιχεί στον πυρήνα και, στη συνέχεια: Αφαιρέστε την επιλογή vga=xxx, εάν υπάρχει. Προσθέστε την επιλογή video=vesabf ή οτιδήποτε ταιριάζει με το υλικό σας. Προσθέστε την επιλογή fbcon=scrollback:128 . Μετά από αυτή τη διαδικασία, η γραμμή παραμέτρων του πυρήνα θα πρέπει να μοιάζει κάπως έτσι:

Πυρήνας /vmlinuz root=/dev/sdb5 video=radeonfb fbcon=scrollback:128

Το ερώτημα είναι γιατί να αφαιρέσετε την επιλογή vga=xxx; Λόγω πιθανών διενέξεων με την επιλογή βίντεο. Στον προσαρμογέα ATI μου, δεν μπορώ να αλλάξω την προσωρινή μνήμη κύλισης εάν εμφανίζεται η λίστα vga=xxx. Ίσως στην περίπτωσή σας να μην ισχύει αυτό. Εάν οι παραπάνω επιλογές λειτουργούν - καλό. αλλά τι γίνεται αν θέλετε να αυξήσετε τον αριθμό των γραμμών ή να ορίσετε μια μικρότερη γραμματοσειρά στην οθόνη; Πάντα το κάνατε αυτό με την επιλογή vga=xxx, και αυτό εξαφανίστηκε. Μην ανησυχείτε - το ίδιο μπορεί να επιτευχθεί αλλάζοντας τις παραμέτρους fbcon όπως περιγράφεται στο αρχείο fbcon.txt(αλλά δεν περιγράφεται σε αυτό το άρθρο).

Με την επιλογή fbcon=scrollback:128, η προσωρινή μνήμη κύλισης αυξήθηκε σε 17 οθόνες (35 φορές Shift+PgUp μισή οθόνη). Παρεμπιπτόντως, το 128 είναι ένα kilobyte. Ο συντάκτης του άρθρου ισχυρίζεται ότι δεν μπορούν να διαπιστωθούν περισσότερα. Δεν προσπάθησα.

Μπορείτε να χρησιμοποιήσετε σενάριο.

Όνομα αρχείου σεναρίου.log

όταν εκτελούνται όλες οι απαιτούμενες εντολές -

Όλα είναι γραμμένα στο filename.log

Το FreeBSD έχει ένα θαυμάσιο βοηθητικό πρόγραμμα ρολογιών που σας επιτρέπει να παρακολουθείτε τερματικά, αλλά όπως αποδείχθηκε, στο Linux εκτελεί εντελώς διαφορετικές λειτουργίες =\ Αξίζει να γκουγκλάρετε σε αυτό το θέμα, υπάρχει κάτι ...

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

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

Όλες οι εντολές που εκτελούμε μας επιστρέφουν τρία είδη δεδομένων:

  • Το αποτέλεσμα της εκτέλεσης της εντολής, συνήθως τα δεδομένα κειμένου που ζητούνται από τον χρήστη.
  • Μηνύματα σφάλματος - ενημέρωση για τη διαδικασία εκτέλεσης εντολών και απρόβλεπτες περιστάσεις που έχουν προκύψει.
  • Ο κωδικός επιστροφής είναι ένας αριθμός που σας επιτρέπει να αξιολογήσετε εάν το πρόγραμμα λειτούργησε σωστά.

Στο Linux, όλες οι ουσίες θεωρούνται αρχεία, συμπεριλαμβανομένων των ροών εισόδου/εξόδου του linux - αρχεία. Κάθε διανομή έχει τρία κύρια αρχεία ροής που μπορούν να χρησιμοποιήσουν τα προγράμματα, ορίζονται από το κέλυφος και προσδιορίζονται από έναν αριθμό περιγραφέα αρχείου:

  • STDIN ή 0- αυτό το αρχείο σχετίζεται με το πληκτρολόγιο και οι περισσότερες εντολές χρησιμοποιούν τα δεδομένα τους από εδώ.
  • STDOUT ή 1- αυτή είναι η τυπική έξοδος, εδώ το πρόγραμμα στέλνει όλα τα αποτελέσματα της εργασίας του. Συνδέεται με την οθόνη, ή για την ακρίβεια, με το τερματικό στο οποίο εκτελείται το πρόγραμμα.
  • STDERR ή 2- όλα τα μηνύματα σφάλματος εξάγονται σε αυτό το αρχείο.

Η ανακατεύθυνση I/O σάς επιτρέπει να αντικαταστήσετε ένα από αυτά τα αρχεία με το δικό σας. Για παράδειγμα, μπορείτε να κάνετε το πρόγραμμα να διαβάζει δεδομένα από ένα αρχείο στο σύστημα αρχείων αντί για το πληκτρολόγιο, μπορείτε επίσης να γράψετε σφάλματα σε ένα αρχείο αντί στην οθόνη και ούτω καθεξής. Όλα αυτά γίνονται χρησιμοποιώντας σύμβολα "<" και ">" .

Ανακατεύθυνση της εξόδου στο αρχείο

Όλα είναι πολύ απλά. Μπορείτε να ανακατευθύνετε την έξοδο σε ένα αρχείο χρησιμοποιώντας το σύμβολο >. Για παράδειγμα, ας αποθηκεύσουμε την έξοδο της εντολής top:

top -bn 5 > top.log

Η επιλογή -b κάνει το πρόγραμμα να εκτελείται σε μη διαδραστική λειτουργία δέσμης και η επιλογή n επαναλαμβάνει τη λειτουργία πέντε φορές για να λάβει πληροφορίες για όλες τις διεργασίες. Ας δούμε τώρα τι συμβαίνει με τη γάτα:

Σύμβολο ">" αντικαθιστά πληροφορίες από το αρχείο εάν υπάρχει ήδη κάτι εκεί. Για να προσθέσετε δεδομένα στο τέλος, χρησιμοποιήστε ">>" . Για παράδειγμα, ανακατευθύνετε την έξοδο σε ένα αρχείο linux για την κορυφή:

top -bn 5 >> top.log

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

top -bn 5 1>top.log

Ανακατεύθυνση σφαλμάτων σε ένα αρχείο

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

Μπορείτε να ανακατευθύνετε το τυπικό σφάλμα σε ένα αρχείο όπως αυτό:

ls -l /root/ 2> ls-error.log
$ cat ls-error.log

Για να προσθέσετε δεδομένα στο τέλος ενός αρχείου, χρησιμοποιήστε το ίδιο σύμβολο:

ls -l /root/ 2>>ls-error.log

Ανακατευθύνετε την τυπική έξοδο και τα σφάλματα σε ένα αρχείο

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

ls -l /root/ >ls-error.log 2>&1

Αρχικά, η έξοδος της εντολής ls θα σταλεί στο αρχείο ls-error.log χρησιμοποιώντας τον πρώτο χαρακτήρα ανακατεύθυνσης. Περαιτέρω όλα τα σφάλματα θα σταλούν στο ίδιο αρχείο. Η δεύτερη μέθοδος είναι πιο εύκολη:

ls -l /root/ &> ls-error.log

Μπορείτε επίσης να χρησιμοποιήσετε το append αντί για την αντικατάσταση:

ls -l /root/ &>> ls-error.log

τυπική είσοδος από το αρχείο

Τα περισσότερα προγράμματα, εκτός από τις υπηρεσίες, λαμβάνουν δεδομένα για την εργασία τους μέσω τυπικής εισαγωγής. Από προεπιλογή, η τυπική είσοδος αναμένει είσοδο από το πληκτρολόγιο. Αλλά μπορείτε να αναγκάσετε το πρόγραμμα να διαβάσει δεδομένα από ένα αρχείο με τη δήλωση "<" :

Γάτα

Μπορείτε επίσης να ανακατευθύνετε αμέσως την έξοδο σε ένα αρχείο. Για παράδειγμα, ας αναδιατάξουμε τη λίστα:

είδος ταξινόμηση εξόδου

Έτσι, ανακατευθύνουμε την έξοδο εισόδου του linux σε μία εντολή.

Χρήση σηράγγων

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

ls -lt | κεφάλι -n 5

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

echo test/tmp/ | xargs -n 1 cp -v testfile.sh

Εδώ, η επιλογή -n 1 καθορίζει ότι μόνο μία παράμετρος πρέπει να αντικατασταθεί για μία εντολή και η επιλογή -v στο cp σάς επιτρέπει να εκτυπώνετε λεπτομερείς πληροφορίες σχετικά με τις κινήσεις. Μια άλλη εντολή που είναι χρήσιμη σε τέτοιες περιπτώσεις είναι το tee. Διαβάζει δεδομένα από τυπική είσοδο και γράφει σε τυπική έξοδο ή αρχεία. Για παράδειγμα:

echo "Tee test" | αρχείο tee1

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

συμπεράσματα

Σε αυτό το άρθρο, καλύψαμε τα βασικά της ανακατεύθυνσης ροής I/O Linux. Τώρα ξέρετε πώς να ανακατευθύνετε την έξοδο σε ένα αρχείο linux ή την έξοδο από ένα αρχείο. Είναι πολύ απλό και βολικό. Εάν έχετε οποιεσδήποτε ερωτήσεις, ρωτήστε στα σχόλια!

Από προεπιλογή, τρία "αρχεία" είναι πάντα ανοιχτά στο σύστημα - (πληκτρολόγιο), (οθόνη) και (εμφάνιση μηνυμάτων σφάλματος στην οθόνη). Αυτά και οποιαδήποτε άλλα ανοιχτά αρχεία, μπορούν να ανακατευθυνθούν. Σε αυτήν την περίπτωση, ο όρος "ανακατεύθυνση" σημαίνει τη λήψη της εξόδου από ένα αρχείο, εντολή, πρόγραμμα, σενάριο ή ακόμα και ένα μεμονωμένο μπλοκ στο σενάριο (βλ. Παράδειγμα 3-1 και Παράδειγμα 3-2) και να το μεταβιβάσετε ως είσοδο στο άλλο αρχείο, εντολή, πρόγραμμα ή σενάριο.

Κάθε ανοιχτό αρχείο έχει έναν περιγραφέα αρχείου που σχετίζεται με αυτό. Οι περιγραφείς αρχείων και είναι 0, 1 και 2, αντίστοιχα. Όταν ανοίγουν πρόσθετα αρχεία, οι περιγραφείς 3 έως 9 παραμένουν ελεύθεροι. Μερικές φορές πρόσθετοι περιγραφείς μπορούν να κάνουν καλή δουλειά διατηρώντας προσωρινά μια αναφορά στο ή. Αυτό καθιστά εύκολη την επαναφορά των περιγραφών στην κανονική τους κατάσταση μετά από πολύπλοκους χειρισμούς ανακατεύθυνσης και μετάθεσης (βλ. Παράδειγμα 16-1).

COMMAND_OUTPUT > # Ανακατεύθυνση stdout (έξοδος) σε αρχείο. # Εάν το αρχείο έλειπε, θα δημιουργηθεί, διαφορετικά θα αντικατασταθεί. ls -lR > dir-tree.list # Δημιουργεί ένα αρχείο που περιέχει μια λίστα δέντρων καταλόγου. : > όνομα αρχείου # Η λειτουργία > περικόπτει το αρχείο "όνομα αρχείου" σε μηδενικό μήκος. # Εάν το αρχείο δεν υπήρχε πριν από τη λειτουργία, # δημιουργείται ένα νέο αρχείο μηδενικού μήκους (η εντολή "touch" έχει το ίδιο αποτέλεσμα). # Σύμβολο: λειτουργεί ως σύμβολο κράτησης θέσης εδώ, χωρίς να βγάζει τίποτα. > όνομα αρχείου # Η λειτουργία > περικόπτει το αρχείο "όνομα αρχείου" σε μηδενικό μήκος. # Εάν το αρχείο δεν υπήρχε πριν από τη λειτουργία, # δημιουργείται ένα νέο αρχείο μηδενικού μήκους (η εντολή "touch" έχει το ίδιο αποτέλεσμα). # (Ίδιο αποτέλεσμα με το παραπάνω - ": >", αλλά αυτή η επιλογή δεν λειτουργεί # σε ορισμένα κελύφη.) COMMAND_OUTPUT >> # Ανακατεύθυνση stdout (έξοδος) σε ένα αρχείο. # Δημιουργεί ένα νέο αρχείο εάν λείπει, διαφορετικά προστίθεται στο τέλος του αρχείου. # Εντολές ανακατεύθυνσης μίας γραμμής # (επηρεάζουν μόνο τη γραμμή στην οποία εμφανίζονται): # ———————————————————————— 1>όνομα αρχείου # Ανακατεύθυνση εξόδου (stdout) για αρχείο "όνομα αρχείου". 1>>όνομα αρχείου # Ανακατεύθυνση εξόδου (stdout) στο αρχείο "όνομα αρχείου", το αρχείο ανοίγει σε λειτουργία προσάρτησης. 2>όνομα αρχείου # Ανακατεύθυνση stderr στο αρχείο "filename". 2>>όνομα αρχείου # Ανακατεύθυνση stderr στο αρχείο "filename", το αρχείο ανοίγει σε λειτουργία προσάρτησης. &>όνομα αρχείου # Ανακατεύθυνση stdout και stderr στο αρχείο "filename". #========================================================================== ============================ # Ανακατεύθυνση stdout, για μία μόνο γραμμή. LOGFILE=script.log echo "Αυτή η γραμμή θα γραφτεί στο αρχείο \"$LOGFILE\"." 1>$LOGFILE echo "Αυτή η γραμμή θα προστεθεί στο τέλος του \"$LOGFILE\"." 1>>$LOGFILE echo "Αυτή η γραμμή θα προστεθεί επίσης στο τέλος του \"$LOGFILE\"." 1>>$LOGFILE echo "Αυτή η γραμμή θα εκτυπωθεί στην οθόνη και δεν θα τοποθετηθεί στο \"$LOGFILE\"." # Μετά από κάθε γραμμή, η ανακατεύθυνση που έγινε αυτόματα "επαναφέρεται". # Ανακατεύθυνση stderr, για μία μόνο γραμμή. ERRORFILE=script.errors bad_command1 2>$ERRORFILE # Το μήνυμα σφάλματος θα γραφτεί στο $ERRORFILE. bad_command2 2>>$ERRORFILE # Το μήνυμα σφάλματος θα προστεθεί στο τέλος του $ERRORFILE. bad_command3 # Το μήνυμα σφάλματος θα εκτυπωθεί στο stderr, #+ και δεν θα μεταβεί στο $ERRORFILE. # Μετά από κάθε γραμμή, η ανακατεύθυνση που έγινε επίσης "ξεπλένεται" αυτόματα. #========================================================================== =========================== 2>&1 # Ανακατεύθυνση stderr στο stdout. # Τα μηνύματα σφάλματος διοχετεύονται στο ίδιο σημείο με το stdout. i> Εγώσε ι. # Έξοδος σε αρχείο με περιγραφέα Εγώπέρασε στο αρχείο με περιγραφικό ι. >&j # Ανακατεύθυνση αρχείου με περιγραφέα 1 (stdout) για αρχείο με περιγραφέα ι. # Η έξοδος στο stdout μεταφέρεται σε ένα αρχείο με περιγραφέα ι. 0< FILENAME < FILENAME # Ввод из файла. # Парная команде ">", βρίσκεται συχνά σε συνδυασμό με αυτό. # # grep αναζήτηση-λέξη όνομα αρχείου # Το αρχείο "όνομα αρχείου" ανοίγει για ανάγνωση και εγγραφή και συσχετίζεται με τον περιγραφέα αρχείου "j". # Εάν το "όνομα αρχείου" απουσιάζει, τότε δημιουργείται. # Εάν ο περιγραφέας "j" δεν έχει καθοριστεί, τότε ο περιγραφέας 0, stdin, λαμβάνεται από προεπιλογή. # # Μια χρήση αυτού είναι η εγγραφή σε μια συγκεκριμένη θέση σε ένα αρχείο. echo 1234567890 > Αρχείο # Γράψτε συμβολοσειρά στο αρχείο "Αρχείο". exec 3<>Αρχείο # Ανοίξτε το "Αρχείο" και συνδέστε το στο χειρισμό 3. διαβάστε -n 4<&3 # Прочитать 4 символа. echo -n . >&3 # Γράψτε έναν χαρακτήρα τελείας. exec 3>&- # Κλείσιμο λαβής 3. cat Αρχείο # ==> 1234.67890 # Τυχαία πρόσβαση και πολλά άλλα! | # Αγωγός (κανάλι). # Ένα καθολικό εργαλείο για το συνδυασμό εντολών σε μία αλυσίδα. # Παρόμοιο με το ">", αλλά στην πραγματικότητα πιο εκτεταμένο. # Χρησιμοποιείται για να συνδυάσει εντολές, σενάρια, αρχεία και προγράμματα σε μία αλυσίδα (pipeline). γάτα *.txt | ταξινόμηση | uniq > result-file # Τα περιεχόμενα όλων των αρχείων .txt ταξινομούνται, οι διπλές γραμμές αφαιρούνται, # το αποτέλεσμα αποθηκεύεται στο αρχείο "result-file".

Οι λειτουργίες ανακατεύθυνσης ή/και οι αγωγοί μπορούν να συνδυαστούν στην ίδια γραμμή εντολών.

εντολή< input-file >εντολή αρχείου εξόδου1 | εντολή2 | command3 > output-file Δείτε Παράδειγμα 12-23 και Παράδειγμα A-17.

Πολλαπλές ροές μπορούν να ανακατευθυνθούν σε ένα μόνο αρχείο.

ls -yz >> command.log 2>&1 # Μια μη έγκυρη επιλογή "yz" στην εντολή "ls" θα γραφτεί στο αρχείο "command.log". # Επειδή το stderr ανακατευθύνεται σε ένα αρχείο.

Κλείσιμο περιγραφέων αρχείων

Κλείστε την περιγραφή του αρχείου εισόδου.

0<&-, <&-

Κλείστε την περιγραφή του αρχείου εξόδου.

1>&-, >&-

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

# Μόνο το stderr περνά στο pipeline. exec 3>&1 # Αποθηκεύστε την τρέχουσα "κατάσταση" του stdout. ls -l 2>&1 >&3 3>&- | grep bad 3>&- # Κλείσιμο descr. 3 για "grep" (αλλά όχι για "ls"). # ^^^^ ^^^^ exec 3>&- # Τώρα κλείστε το για το υπόλοιπο σενάριο. # Ευχαριστώ S.C.

Για περισσότερες πληροφορίες σχετικά με την ανακατεύθυνση I/O, ανατρέξτε στο Παράρτημα Δ.

16.1. Με την εντολή εκτελεστ

Ομάδα εκτελεστ ανακατευθύνει την είσοδο από σε ένα αρχείο. Από εδώ και στο εξής, όλες οι εισαγωγές, αντί (συνήθως το πληκτρολόγιο), θα γίνονται από αυτό το αρχείο. Αυτό καθιστά δυνατή την ανάγνωση των περιεχομένων ενός αρχείου, γραμμή προς γραμμή, και την ανάλυση κάθε γραμμής που εισάγεται με sed και/ή awk.

Παράδειγμα 16-1. Ανακατεύθυνση με exec

#!/bin/bash # Ανακατεύθυνση stdin με "exec". exec 6<&0 # Связать дескр. #6 со стандартным вводом (stdin). # Сохраняя stdin. exec < data-file # stdin заменяется файлом "data-file" read a1 # Читается первая строка из "data-file". read a2 # Читается вторая строка из "data-file." echo echo "Следующие строки были прочитаны из файла." echo "——————————————" echo $a1 echo $a2 echo; echo; echo exec 0<&6 6<&- # Восстанавливается stdin из дескр. #6, где он был предварительно сохранен, #+ и дескр. #6 закрывается (6<&-) освобождая его для других процессов. # # <&6 6<&- дает тот же результат. echo -n "Введите строку " read b1 # Теперь функция "read", как и следовало ожидать, принимает данные с обычного stdin. echo "Строка, принятая со stdin." echo "—————————" echo "b1 = $b1" echo exit 0

Ομοίως, το σχέδιο exec>όνομα αρχείουανακατευθύνει την έξοδο στο δεδομένο αρχείο. Μετά από αυτό, όλα τα αποτελέσματα από εντολές στις οποίες κανονικά θα κατευθυνόταν εξάγονται τώρα σε αυτό το αρχείο.

Παράδειγμα 16-2. Ανακατεύθυνση με exec

#!/bin/bash # reassign-stdout.sh LOGFILE=logfile.txt exec 6>&1 # Εκχώρηση desc. Νο 6 με stdout. # Αποθήκευση stdout. exec > $LOGFILE # stdout αντικαθίσταται από το "logfile.txt". # ———————————————————— # # Όλα τα αποτελέσματα από τις εντολές σε αυτό το μπλοκ γράφονται στο $LOGFILE. echo -n "Αρχείο καταγραφής: " echo ημερομηνίας "—————————————-" echo echo "Έξοδος εντολών \"ls -al\"" echo ls -al echo; echo echo "Έξοδος εντολής \"df\"" echo df # ————————————————————# exec 1>&6 6>&- # Restore stdout και κλείσιμο desc . #6. echo echo "== stdout επαναφέρθηκε στην προεπιλογή == " echo ls -al echo exit 0

Παράδειγμα 16-3. Ταυτόχρονη ανακατεύθυνση συσκευών και, χρησιμοποιώντας την εντολή exec

#!/bin/bash # upperconv.sh # Μετατροπή χαρακτήρων στο αρχείο εισόδου σε κεφαλαία. E_FILE_ACCESS=70 E_WRONG_ARGS=71 εάν [ ! -r "$1" ] # Είναι το αρχείο αναγνώσιμο; και μετά ηχώ "Δεν είναι δυνατή η ανάγνωση από το καθορισμένο αρχείο!" echo "Χρήση: $0 input-file output-file" έξοδος $E_FILE_ACCESS fi # Εάν δεν δοθεί το αρχείο εισόδου ($1) #+ ο κωδικός εξόδου θα είναι ο ίδιος. αν [ -z "$2" ] τότε επαναλάβετε "Πρέπει να καθορίσετε ένα αρχείο εξόδου." echo "Χρήση: $0 input-file output-file" έξοδος $E_WRONG_ARGS fi exec 4<&0 exec < $1 # Назначить ввод из входного файла. exec 7>&1 exec > $2 # Εκχώρηση εξόδου στο αρχείο εξόδου. # Υποθέτει ότι το αρχείο εξόδου είναι εγγράψιμο # (προσθήκη ελέγχου;). # ———————————————— γάτα — | tr a-z A-Z # Μετατροπή σε κεφαλαίο # ^^^^^ # Ανάγνωση από το stdin. # ^^^^^^^^^^^ # Γράψιμο στο stdout. # Ωστόσο, τόσο το stdin όσο και το stdout έχουν ανακατευθυνθεί. # ———————————————— exec 1>&7 7>&- # Restore stdout. exec 0<&4 4<&- # Восстановить stdin. # После восстановления, следующая строка выводится на stdout, чего и следовало ожидать. echo "Символы из \"$1\" преобразованы в верхний регистр, результат записан в \"$2\"." exit 0

Επόμενο:Ανακατεύθυνση σφαλμάτων σε αρχείο πάνω:Ανακατεύθυνση I/O Προηγούμενος:Ανακατεύθυνση εισόδου από αρχείο περιεχόμενο Δείκτης

Ανακατεύθυνση εξόδου σε αρχείο

Για να ανακατευθύνετε την τυπική έξοδο σε ένα αρχείο, χρησιμοποιήστε τον τελεστή «>».

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

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

Εάν ανακατευθύνετε την τυπική έξοδο σε ένα ήδη υπάρχον αρχείο, θα αντικατασταθεί από την αρχή. Για να προσθέσετε τυπική έξοδο στα περιεχόμενα ενός υπάρχοντος αρχείου, πρέπει να χρησιμοποιήσετε τον τελεστή «»». Για παράδειγμα, για να προσθέσετε τα αποτελέσματα της εργασίας όταν εκτελείτε ξανά το πρόγραμμα σε ένα αρχείο, πληκτρολογήστε:

Alex Otwagin 2002-12-16

Ένα πρόγραμμα είναι συνήθως πολύτιμο επειδή μπορεί να επεξεργάζεται δεδομένα: αποδέχεται ένα πράγμα, δίνει ένα άλλο έξοδο και σχεδόν οτιδήποτε μπορεί να λειτουργήσει ως δεδομένα: κείμενο, αριθμοί, ήχος, βίντεο... Οι ροές δεδομένων εισόδου και εξόδου για μια εντολή ονομάζονται εισαγωγήκαι συμπέρασμα. Κάθε πρόγραμμα μπορεί να έχει πολλές ροές εισόδου και εξόδου. Κάθε διεργασία, όταν δημιουργείται, χωρίς αποτυχία λαμβάνει το λεγόμενο τυπική είσοδος(τυπική είσοδος, stdin) και τυπική έξοδος(τυπική έξοδος, stdout) και τυπική έξοδος σφάλματος(τυπικό σφάλμα, stderr).

Οι τυπικές ροές εισόδου/εξόδου έχουν σχεδιαστεί κυρίως για την ανταλλαγή πληροφοριών κειμένου. Δεν έχει καν σημασία ποιος επικοινωνεί μέσω κειμένων: ένα άτομο με ένα πρόγραμμα ή προγράμματα μεταξύ τους - το κύριο πράγμα είναι ότι έχουν ένα κανάλι μετάδοσης δεδομένων και ότι μιλούν "την ίδια γλώσσα".

Η κειμενική αρχή της εργασίας με το μηχάνημα σάς επιτρέπει να κάνετε αφαίρεση από συγκεκριμένα μέρη του υπολογιστή, όπως το πληκτρολόγιο συστήματος και την κάρτα βίντεο με οθόνη, λαμβάνοντας υπόψη ένα μόνο τερματική συσκευή, μέσω του οποίου ο χρήστης εισάγει κείμενο (εντολές) και το μεταδίδει στο σύστημα και το σύστημα εμφανίζει τα δεδομένα και τα μηνύματα που είναι απαραίτητα για τον χρήστη (διαγνωστικά και σφάλματα). Μια τέτοια συσκευή ονομάζεται τερματικό. Γενικά, ένα τερματικό είναι το σημείο εισόδου ενός χρήστη στο σύστημα που έχει τη δυνατότητα να μεταδίδει πληροφορίες κειμένου. Το τερματικό μπορεί να είναι μια ξεχωριστή εξωτερική συσκευή συνδεδεμένη στον υπολογιστή μέσω μιας σειριακής θύρας δεδομένων (σε έναν προσωπικό υπολογιστή ονομάζεται "θύρα COM"). Ένα πρόγραμμα (για παράδειγμα, xterm ή ssh) μπορεί να λειτουργήσει ως τερματικό (με κάποια υποστήριξη από το σύστημα). Τελικά, εικονικές κονσόλες- επίσης τερματικά, οργανωμένα μόνο μέσω προγραμματισμού με τη βοήθεια κατάλληλων συσκευών ενός σύγχρονου υπολογιστή.

Όταν εργάζεστε με τη γραμμή εντολών, η τυπική είσοδος του κελύφους σχετίζεται με το πληκτρολόγιο και η τυπική έξοδος και έξοδος σφάλματος σχετίζεται με την οθόνη της οθόνης (ή το παράθυρο του εξομοιωτή τερματικού). Ας δείξουμε στο παράδειγμα της απλούστερης εντολής - cat. Συνήθως η εντολή Γάταδιαβάζει δεδομένα από όλα τα αρχεία που καθορίζονται ως παράμετροί του και στέλνει την ανάγνωση απευθείας στην τυπική έξοδο (stdout). Επομένως, η εντολή

/home/larry/papers# ιστορία γάτας-τελικός μεταπτυχιακός-διατριβή

θα εμφανίσει πρώτα τα περιεχόμενα του αρχείου και μετά το αρχείο.

Ωστόσο, εάν δεν έχει καθοριστεί όνομα αρχείου, το πρόγραμμα Γάταδιαβάζει είσοδο από το stdin και το επιστρέφει αμέσως στο stdout (χωρίς να το αλλάξει με κανέναν τρόπο). Τα δεδομένα περνούν Γάτασαν μέσα από σωλήνα. Ας πάρουμε ένα παράδειγμα:

/home/larry/papers# cat Γεια σας. Γειά σου. Αντίο. Αντίο. ctrlρε/home/larry/papers#

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

Ας πάρουμε ένα άλλο παράδειγμα. Ομάδα είδοςδιαβάζει γραμμές κειμένου εισόδου (επίσης από το stdin εάν δεν δίνεται όνομα αρχείου) και εξάγει ένα σύνολο από αυτές τις γραμμές σε διατεταγμένη μορφή σε stdout. Ας ελέγξουμε τη δράση του.

/home/larry/papers# ταξινόμηση μπανάνες καρότα μήλα Ctrl+D μήλα μπανάνες καρότα /home/larry/papers#

Όπως μπορείτε να δείτε, αφού πατήσετε ctrlρε, είδοςτύπωσε τις γραμμές με αλφαβητική σειρά.

Τυπική είσοδος και τυπική έξοδος

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

/home/larry/papers# sort > λίστα αγορών μπανάνες καρότα μήλα ctrlρε/home/larry/papers#

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

/home/larry/papers# cat shopping-list μήλα μπανάνες καρότα /home/larry/papers#

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

/home/larry/papers# ταξινόμηση αντικειμένων shopping-list /home/larry/papers# cat shopping-list μήλα μπανάνες καρότα /home/larry/papers#

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

/home/larry/papers# ταξινόμηση< items apples bananas carrots /home/larry/papers#

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

Ας εισαγάγουμε την έννοια φίλτρο. Ένα φίλτρο είναι ένα πρόγραμμα που διαβάζει δεδομένα από τυπική είσοδο, τα επεξεργάζεται με κάποιο τρόπο και στέλνει το αποτέλεσμα στην τυπική έξοδο. Όταν χρησιμοποιείται ανακατεύθυνση, η τυπική είσοδος και έξοδος μπορεί να είναι αρχεία. Όπως αναφέρθηκε παραπάνω, από προεπιλογή, το stdin και το stdout αναφέρονται στο πληκτρολόγιο και στην οθόνη, αντίστοιχα. Το πρόγραμμα ταξινόμησης είναι ένα απλό φίλτρο - ταξινομεί την είσοδο και στέλνει το αποτέλεσμα στην τυπική έξοδο. Ένα πολύ απλό φίλτρο είναι το πρόγραμμα Γάτα- δεν κάνει τίποτα με τα δεδομένα εισόδου, αλλά απλώς τα στέλνει στην έξοδο.

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

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

Ανακατεύθυνση I/O

Ας εκτελέσουμε πρώτα την εντολή ls:

/home/larry/papers# ls English-list history-final masters-thesis notes /home/larry/papers#

Τώρα ανακατευθύνουμε την έξοδο της εντολής lsσε ένα αρχείο με το όνομα file-list

/home/larry/papers# ls > file-list /home/larry/papers# sort -r file-list notes masters-thesis history-final English-list /home/larry/papers#

Εδώ είναι η έξοδος της εντολής lsαποθηκεύτηκε σε ένα αρχείο και στη συνέχεια αυτό το αρχείο υποβλήθηκε σε επεξεργασία από την εντολή είδος. Ωστόσο, αυτή η διαδρομή είναι άκομψη και απαιτεί τη χρήση ενός προσωρινού αρχείου για την αποθήκευση της εξόδου του προγράμματος. ls.

Η λύση σε αυτή την κατάσταση είναι η δημιουργία ελλιμενισμένες ομάδες(σωλήνες). Η σύνδεση εκτελείται από το κέλυφος, το οποίο κατευθύνει το stdout της πρώτης εντολής στο stdin της δεύτερης εντολής. Σε αυτήν την περίπτωση, θέλουμε να στείλουμε το stdout της εντολής lsστις εντολές stdin είδος. Ένα σύμβολο χρησιμοποιείται για τη σύνδεση, όπως φαίνεται στο ακόλουθο παράδειγμα:

/home/larry/papers# ls | sort -r notes masters-thesis history-final English-list /home/larry/papers#

Αυτή η εντολή είναι μικρότερη από το σύνολο των εντολών και πληκτρολογείται ευκολότερα.

Ας δούμε ένα άλλο χρήσιμο παράδειγμα. Ομάδα

/home/larry/papers# ls /usr/bin

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

/home/larry/papers# ls /usr/bin | περισσότερο

Τώρα μπορείτε να μετακινηθείτε σε αυτήν τη λίστα.

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

/home/larry/papers# ls | ταξινόμηση-r | head -1 σημειώσεις /home/larry/papers\#

που είναι η ομάδα κεφάλιεμφανίζει την πρώτη γραμμή της ροής εισόδου των γραμμών που λαμβάνει (στην περίπτωσή μας, η ροή αποτελείται από δεδομένα από την εντολή ls), ταξινομημένο με αντίστροφη αλφαβητική σειρά.

Χρήση εντολών σύνδεσης (pipeline)

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

/home/larry/papers# ls > λίστα αρχείων

θα καταστρέψει τα περιεχόμενα του αρχείου, εάν το αρχείο υπήρχε προηγουμένως, και θα δημιουργήσει ένα νέο αρχείο στη θέση του.

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

/home/larry/papers# ls >> λίστα αρχείων

αποδίδουν την έξοδο της εντολής lsστο τέλος του αρχείου.

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

Μη καταστροφική ανακατεύθυνση εξόδου

Κάτι τέτοιο πρέπει να κάνει αυτό που χρειάζεστε;

Δείτε το: Wintee

Δεν χρειάζεται cygwin.

Ωστόσο, έχω αντιμετωπίσει και έχω αναφέρει ορισμένα προβλήματα.

Μπορείτε επίσης να ελέγξετε το http://unxutils.sourceforge.net/ επειδή περιέχει tee (και δεν χρειάζεται cygwin), αλλά προσέξτε ότι οι έξοδοι EOL είναι τύπου UNIX.

Τελευταίο αλλά εξίσου σημαντικό, αν έχετε PowerShell, μπορείτε να δοκιμάσετε το Tee-Object. Πληκτρολογήστε την κονσόλα PowerShell για περισσότερες πληροφορίες.

Αυτό λειτουργεί, αν και είναι λίγο άσχημο:

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

Το χρησιμοποιώ αρκετά σε ομαδικά αρχεία για την καταγραφή και την εμφάνιση μηνυμάτων:

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

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

Τουλάχιστον με αυτόν τον τρόπο δεν χρειάζεται να κάνετε αλλαγές σε μηνύματα σε δύο μέρη.

Σημειώστε ότι το _ είναι απλώς ένα σύντομο όνομα αρχείου, επομένως θα πρέπει να το αφαιρέσετε στο τέλος του αρχείου δέσμης (εάν χρησιμοποιείτε αρχείο δέσμης).

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

Εάν έχετε το cygwin στη διαδρομή περιβάλλοντος των Windows, μπορείτε να χρησιμοποιήσετε:

Μια απλή εφαρμογή κονσόλας C# θα έκανε το κόλπο:

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

Θα εμφανίζει αποτελέσματα αναζήτησης και θα αποθηκεύει αποτελέσματα στα files1.txt και files2.txt.

Σημειώστε ότι δεν υπάρχουν πολλά (τίποτα!) στον τρόπο διαχείρισης σφαλμάτων και ενδέχεται να μην απαιτείται υποστήριξη πολλαπλών αρχείων.

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

Καταγράφει ακόμη και οποιαδήποτε εντολή PAUSE.

Μια εναλλακτική είναι να συνδέσετε το stdout σε stderr στο πρόγραμμά σας:

Στη συνέχεια, στο batchfile dos σας:

Το Stdout θα μεταβεί στο αρχείο καταγραφής και το stderr (ίδια δεδομένα) θα εμφανιστεί στην κονσόλα.

Πώς να εμφανίσετε και να ανακατευθύνετε την έξοδο σε ένα αρχείο. Ας υποθέσουμε ότι αν χρησιμοποιήσω την εντολή dos, dir > test.txt, αυτή η εντολή ανακατευθύνει την έξοδο στο αρχείο test.txt χωρίς να εμφανίζει τα αποτελέσματα. πώς να γράψετε μια εντολή για να εκτυπώσετε την έξοδο και να ανακατευθύνετε την έξοδο σε ένα αρχείο χρησιμοποιώντας DOS, δηλαδή γραμμή εντολών των Windows, όχι UNIX/LINUX.

Μπορεί να σας φανούν χρήσιμες αυτές οι εντολές στο biterscripting (http://www.biterscripting.com).

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

  • Η εντολή ορίζεται ως μεταβλητή που μπορεί να χρησιμοποιηθεί αργότερα στον κώδικα για έξοδο στο παράθυρο εντολών και προσάρτηση στο αρχείο καταγραφής χρησιμοποιώντας
    • η εντολή αποφεύγει την ανακατεύθυνση χρησιμοποιώντας χαρακτήρα καρότο έτσι ώστε οι εντολές να μην αξιολογούνται αρχικά
  • Δημιουργείται ένα προσωρινό αρχείο με όνομα αρχείου παρόμοιο με ένα αρχείο δέσμης με όνομα που χρησιμοποιεί τη σύνταξη επέκτασης παραμέτρου γραμμής εντολών για να πάρει το όνομα του αρχείου δέσμης.
  • Το αποτέλεσμα προστίθεται σε ξεχωριστό αρχείο καταγραφής

Εδώ είναι η σειρά των εντολών:

  1. Τα μηνύματα εξόδου και σφάλματος αποστέλλονται σε ένα προσωρινό αρχείο
  2. Τα περιεχόμενα του προσωρινού αρχείου είναι τότε:
    • προστέθηκε στο αρχείο καταγραφής
    • έξοδος στο παράθυρο εντολών
  3. Το προσωρινό αρχείο μηνύματος διαγράφεται

Εδώ είναι ένα παράδειγμα:

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

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

Συμφωνώ με τον Brian Rasmussen, η θύρα unxutils είναι ο ευκολότερος τρόπος για να γίνει αυτό. Στην ενότητα Batch Files των σελίδων του Scripting, ο Rob van der Woude παρέχει έναν τόνο πληροφοριών σχετικά με τη χρήση εντολών MS-DOS και CMD. Σκέφτηκα ότι μπορεί να έχει τη δική του λύση στο πρόβλημά σας και αφού έψαξα εκεί στο TEE.BAT, βρήκα το TEE.BAT , που φαίνεται να είναι ακριβώς αυτό, ένα πακέτο γλώσσας MS-DOS συσκευασμένο. Είναι ένα αρκετά περίπλοκο αρχείο δέσμης και θα ήθελα να χρησιμοποιήσω τη θύρα unxutils.

Εγκαθιστώ την perl στα περισσότερα από τα μηχανήματα μου, οπότε η απάντηση είναι με την perl: tee.pl

σκηνοθεσία | perl tee.pl ή κατάλογος | perl tee.pl dir.bat

ακατέργαστο και μη δοκιμασμένο.

Ενώ κανονικά, όπως αναφέρθηκε, το πρόγραμμα I/O συνδέεται με τυπικές ροές, υπάρχουν ειδικές εγκαταστάσεις στο κέλυφος για την ανακατεύθυνση I/O.

5.5.1 Χειριστές >,< и >>

Τα σύμβολα " χρησιμοποιούνται για να υποδείξουν μια ανακατεύθυνση. > ", "< " και " >> ". Η πιο συνηθισμένη χρήση είναι η ανακατεύθυνση της εξόδου μιας εντολής σε ένα αρχείο. Ακολουθεί ένα σχετικό παράδειγμα:

$ ls -l > /home/jim/dir.txt

Αυτή η εντολή θα αποθηκεύσει μια λίστα αρχείων και υποκαταλόγων του καταλόγου που ήταν ενημερωμένος τη στιγμή που εκτελέστηκε η εντολή στο αρχείο /home/jim/dir.txt ls; Ταυτόχρονα, εάν το καθορισμένο αρχείο δεν υπήρχε, θα δημιουργηθεί. αν υπήρχε, θα αντικατασταθεί. εάν θέλετε η έξοδος της εντολής να προσαρτηθεί στο τέλος ενός υπάρχοντος αρχείου, τότε αντί για το σύμβολο > χρήση >> . Σε αυτή την περίπτωση, η παρουσία διαστημάτων πριν ή μετά από χαρακτήρες > ή >> είναι ασήμαντο και είναι μόνο για τη διευκόλυνση του χρήστη.

Μπορείτε να κατευθύνετε την έξοδο όχι μόνο σε ένα αρχείο, αλλά και στην είσοδο μιας άλλης εντολής ή σε μια συσκευή (όπως ένας εκτυπωτής). Για παράδειγμα, για να μετρήσετε τον αριθμό των λέξεων στο αρχείο /home/jim/report.txt, μπορείτε να χρησιμοποιήσετε την ακόλουθη εντολή:

$ cat /home/jim/report.txt > wc -w

και για να εκτυπώσετε το αρχείο - την εντολή:

$ cat /home/jim/report.txt > lpr

Όπως μπορείτε να δείτε, ο χειριστής > χρησιμεύει για την ανακατεύθυνση της ροής εξόδου. Σε σχέση με τη ροή εισόδου, μια παρόμοια λειτουργία εκτελείται από τον χειριστή < . Το παραπάνω παράδειγμα εντολής για την καταμέτρηση του αριθμού των λέξεων σε ένα συγκεκριμένο αρχείο μπορεί να ξαναγραφεί ως εξής (σημειώστε την απουσία της εντολής Γάτα):

$ wc -w< /home/jim/report.txt

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

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

$ cat > αρχείο

$cat>αρχείο

$ >filecat

$ > αρχείο cat

Ωστόσο, από μόνος του (χωρίς καμία εντολή για την οποία ορίζονται τυπικές ροές) ο χαρακτήρας ανακατεύθυνσης δεν μπορεί να χρησιμοποιηθεί, επομένως δεν μπορείτε, για παράδειγμα, πληκτρολογώντας στη γραμμή εντολών

$ file1 > file2

λάβετε ένα αντίγραφο κάποιου αρχείου. Αλλά αυτό δεν μειώνει την αξία αυτού του μηχανισμού, επειδή ορίζονται τυπικές ροές για οποιαδήποτε εντολή. Σε αυτήν την περίπτωση, μπορείτε να ανακατευθύνετε όχι μόνο την τυπική είσοδο και έξοδο, αλλά και άλλες ροές. Για να το κάνετε αυτό, πρέπει να καθορίσετε τον αριθμό της ροής που θα ανακατευθυνθεί πριν από το σύμβολο ανακατεύθυνσης. Η τυπική είσοδος stdin είναι ο αριθμός 0, η τυπική έξοδος stdout είναι ο αριθμός 1, η τυπική ροή μηνύματος σφάλματος stderr είναι ο αριθμός 2. Δηλαδή, η πλήρης μορφή της εντολής ανακατεύθυνσης είναι (θυμηθείτε ότι τα κενά δίπλα στο > δεν απαιτούνται):

εντολή N > M

όπου Νκαι Μ— αριθμοί τυπικών ροών (0,1,2) ή ονομάτων αρχείων. Η χρήση συμβόλων σε ορισμένες περιπτώσεις < , > και >> χωρίς τον καθορισμό του αριθμού καναλιού ή του ονόματος αρχείου είναι δυνατή μόνο επειδή αντί για τον αριθμό που λείπει, το 1 αντικαθίσταται από προεπιλογή, δηλαδή η τυπική έξοδος. Ναι, ο χειριστής > χωρίς αριθμό ερμηνεύεται ως 1 > .

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

εντολή N > &M

Αυτή η εντολή σημαίνει ότι η έξοδος του καναλιού με τον αριθμό Ναποστέλλεται και στην τυπική έξοδο και αντιγράφεται στο σωλήνα με τον αριθμό Μ. Για παράδειγμα, για να αντιγραφούν μηνύματα σφάλματος στην τυπική έξοδο, πρέπει να εκδώσετε την εντολή 2>&1, ενώ 1>&2 αντιγράφει το stdout στο stderr. Αυτή η δυνατότητα είναι ιδιαίτερα χρήσιμη κατά την ανακατεύθυνση της εξόδου σε ένα αρχείο, καθώς και οι δύο βλέπουμε τα μηνύματα στην οθόνη και τα αποθηκεύουμε σε ένα αρχείο.

5.5.2 Χειριστής |

Μια ειδική παραλλαγή της ανακατεύθυνσης εξόδου είναι η οργάνωση ενός καναλιού προγράμματος (μερικές φορές ονομάζεται αγωγός ή αγωγός). Για να γίνει αυτό, δύο ή περισσότερες εντολές, έτσι ώστε η έξοδος της προηγούμενης να χρησιμεύει ως είσοδος για την επόμενη, συνδέονται (ή χωρίζονται, αν σας αρέσει καλύτερα) με έναν χαρακτήρα σωλήνα - "|". Σε αυτήν την περίπτωση, η τυπική ροή εξόδου της εντολής βρίσκεται στα αριστερά του συμβόλου | , κατευθύνεται στην τυπική είσοδο του προγράμματος που βρίσκεται στα δεξιά του χαρακτήρα | . Για παράδειγμα:

$ cat myfile | grep Linux | wc -l

Αυτή η γραμμή σημαίνει ότι η έξοδος της εντολής Γάτα, δηλαδή το κείμενο από το αρχείο myfile, θα κατευθυνθεί στην είσοδο της εντολής grep, το οποίο θα επιλέξει μόνο γραμμές που περιέχουν τη λέξη "Linux". έξοδος εντολής grepθα δρομολογηθεί με τη σειρά του στην είσοδο της εντολής wc -l, το οποίο θα μετρήσει τον αριθμό τέτοιων σειρών.

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

Θα πρέπει να σημειωθεί ότι το κέλυφος καλεί ταυτόχρονα όλες τις εντολές που περιλαμβάνονται στο pipeline, εκτελώντας μια ξεχωριστή παρουσία του φλοιού για κάθε μία από τις εντολές, έτσι ώστε μόλις το πρώτο πρόγραμμα αρχίσει να εκδίδει κάτι στη ροή εξόδου του, η επόμενη εντολή αρχίζει να το επεξεργάζεται. Με τον ίδιο τρόπο, κάθε επόμενη εντολή εκτελεί τη λειτουργία της, περιμένοντας δεδομένα από την προηγούμενη εντολή και δίνοντας τα αποτελέσματά της ως είσοδο στην επόμενη. Εάν θέλετε μια εντολή να ολοκληρωθεί πλήρως πριν αρχίσει να εκτελείται η επόμενη, μπορείτε να τη χρησιμοποιήσετε στην ίδια γραμμή ως σύμβολο σωλήνα | και ένα ερωτηματικό ; . Πριν από κάθε ερωτηματικό, το κέλυφος θα σταματήσει και θα περιμένει έως ότου ολοκληρωθεί η εκτέλεση όλων των προηγούμενων εντολών που περιλαμβάνονται στο pipeline.

Η κατάσταση εξόδου (ο boolean που επιστρέφεται όταν τερματίζεται το πρόγραμμα) από το σωλήνα είναι η ίδια με την κατάσταση εξόδου που επιστρέφεται από την τελευταία εντολή στο pipeline. Πριν από την πρώτη εντολή του αγωγού, μπορείτε να βάλετε το σύμβολο "!", τότε η κατάσταση εξόδου από τη διοχέτευση θα είναι μια λογική άρνηση της κατάστασης εξόδου από την τελευταία εντολή. Το κέλυφος περιμένει να ολοκληρωθούν όλες οι εντολές διοχέτευσης πριν ορίσει την τιμή επιστροφής.

5.5.3 Φίλτρα

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

Πίνακας 5.1.Εντολές φίλτρου

Ομάδα

Σύντομη περιγραφή

grep, fgrep, egrep

Αναζητήστε το αρχείο εισόδου ή την τυπική είσοδο για γραμμές που περιέχουν το καθορισμένο μοτίβο και γράψτε τις στην τυπική έξοδο

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

comm

Συγκρίνει δύο αρχεία γραμμή προς γραμμή και γράφει 3 στήλες στο stdout: η μία περιέχει γραμμές που εμφανίζονται μόνο στο αρχείο 1, η δεύτερη περιέχει γραμμές που εμφανίζονται μόνο στο αρχείο 2: και η τρίτη περιέχει γραμμές που εμφανίζονται και στα δύο αρχεία

Μορφοποιεί ένα αρχείο κειμένου ή τα περιεχόμενα της τυπικής εισαγωγής για εκτύπωση.

sed

Επεξεργαστής γραμμής που χρησιμοποιείται για την εκτέλεση ορισμένων μετασχηματισμών στη ροή δεδομένων εισόδου (που λαμβάνονται από αρχείο ή τυπική είσοδο)

Το ειδικό φίλτρο είναι η εντολή στόχος, το οποίο "διπλασιάζει" τη ροή εισόδου, αφενός κατευθύνοντάς την σε τυπική έξοδο και αφετέρου - σε ένα αρχείο (το όνομα του οποίου πρέπει να καθορίσετε). Είναι εύκολο να διαπιστωθεί ότι στη δράση της η εντολή στόχοςπαρόμοια με τον τελεστή ανακατεύθυνσης 1>&αρχείο.

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

Πολλά θα μπορούσαν να ειπωθούν για την ανακατεύθυνση και τα φίλτρα. Αλλά αυτό το υλικό βρίσκεται στα περισσότερα βιβλία UNIX και Linux, όπως το Petersen [A1.4] και το Kelly-Bootle [A1.8] . Επομένως, περιοριζόμαστε σε αυτά που ειπώθηκαν και προχωράμε στην εξέταση του λεγόμενου περιβάλλοντος ή περιβάλλοντος που δημιουργείται από το κέλυφος.

V. Kostromin (kos at rus-linux dot net) - 5,5. Ανακατεύθυνση I/O, κανάλια και φίλτρα

Σύστημα I/O σε LINUX.

Στο σύστημα I/O, όλες οι εξωτερικές συσκευές αντιμετωπίζονται ως αρχεία στα οποία επιτρέπονται οι κανονικές λειτουργίες αρχείων. Φυσικά, υπάρχουν και προγράμματα οδήγησης συσκευών, αλλά η διεπαφή με αυτά έχει σχεδιαστεί για τον χρήστη ως κλήση σε ένα ειδικό αρχείο. Τα ειδικά αρχεία είναι ένα μέσο ενοποίησης του συστήματος I/O.

Κάθε συνδεδεμένη συσκευή (τερματικό, δίσκοι, εκτυπωτής κ.λπ.) έχει τουλάχιστον ένα ειδικό αρχείο που σχετίζεται με αυτήν. Τα περισσότερα από αυτά τα ειδικά αρχεία αποθηκεύονται στον κατάλογο /dev:
$ cd /dev
$ ls -l
πίνακας ελέγχου συστήματος της σόλας
dsk κομμάτια στο δίσκο
fd0 δισκέτα 1
mem μνήμη
εκτυπωτής lp
lp0 παράλληλη θύρα 0
. . .
τμήμα ρίζας στο δίσκο για το ριζικό σύστημα αρχείων
swap swap τμήμα
εναλλακτικό όνομα κονσόλας syscon
systty είναι ένα άλλο όνομα για την κονσόλα συστήματος
κατάλογος όρων για τερματικά
ttyS0 σειριακή θύρα 0 (COM1)
. . .

Όταν ένα πρόγραμμα γράφει σε ένα τέτοιο ειδικό αρχείο, το σύστημα του λειτουργικού συστήματος τα παρεμποδίζει και τα στέλνει σε μια συσκευή, όπως έναν εκτυπωτή). Κατά την ανάγνωση δεδομένων από αυτόν τον τύπο αρχείου, στην πραγματικότητα λαμβάνονται από μια συσκευή όπως ένας δίσκος. Το πρόγραμμα δεν πρέπει να λαμβάνει υπόψη τις ιδιαιτερότητες της συσκευής I/O. Για το σκοπό αυτό εξυπηρετούν ειδικά αρχεία (drivers), τα οποία λειτουργούν ως διεπαφή μεταξύ των στοιχείων του πυρήνα του ΛΣ και των προγραμμάτων εφαρμογών γενικής χρήσης.

Το σύστημα εντοπίζει τη διαφορά μεταξύ ενός κανονικού αρχείου και ενός ειδικού αρχείου μόνο αφού έχει αναλύσει τον αντίστοιχο inode που αναφέρεται από την καταχώρηση καταλόγου.
Το inode του ειδικού αρχείου περιέχει πληροφορίες σχετικά με την κατηγορία, τον τύπο και τον αριθμό της συσκευής. Η κλάση συσκευών ορίζει τόσο τις συσκευές χαρακτήρα προς χαρακτήρα όσο και μπλοκ προς μπλοκ. Ένα παράδειγμα συσκευής με ανταλλαγή χαρακτήρα προς χαρακτήρα είναι ένα πληκτρολόγιο. Τα ειδικά αρχεία που παρέχουν επικοινωνία με συσκευές αυτού του τύπου ονομάζονται byte-oriented. Οι συσκευές μπλοκ χαρακτηρίζονται από την ανταλλαγή μεγάλων μπλοκ πληροφοριών, γεγονός που επιταχύνει την ανταλλαγή και την καθιστά πιο αποτελεσματική. Όλες οι συσκευές δίσκου υποστηρίζουν την ανταλλαγή μπλοκ και τα ειδικά αρχεία που τις εξυπηρετούν ονομάζονται προσανατολισμένα σε μπλοκ. Τα ειδικά αρχεία δεν περιέχουν πληροφορίες χαρακτήρων, επομένως το μήκος τους δεν αναφέρεται στη λίστα καταλόγου.

Ο τύπος και ο αριθμός της συσκευής είναι επίσης τα κύρια χαρακτηριστικά των ειδικών αρχείων (ο κύριος και ο δευτερεύων αριθμός της αντίστοιχης συσκευής τοποθετούνται στο πεδίο μήκους). Το πρώτο από αυτά καθορίζει τον τύπο της συσκευής, το δεύτερο - το προσδιορίζει μεταξύ παρόμοιων συσκευών. Το λειτουργικό σύστημα μπορεί να εξυπηρετήσει ταυτόχρονα πολλές δεκάδες, ακόμη και εκατοντάδες τερματικά. Κάθε ένα από αυτά πρέπει να έχει το δικό του ειδικό αρχείο, επομένως η παρουσία ενός μεγάλου και δευτερεύοντος αριθμού σάς επιτρέπει να καθορίσετε την απαιτούμενη αντιστοιχία μεταξύ της συσκευής και ενός τέτοιου αρχείου.

Μπορείτε να δημιουργήσετε πολλά συστήματα αρχείων σε έναν μόνο δίσκο. Ορισμένα συστήματα χρησιμοποιούν ένα σύστημα αρχείων ανά δίσκο, ενώ άλλα χρησιμοποιούν πολλά. Ένα νέο σύστημα αρχείων μπορεί να δημιουργηθεί χρησιμοποιώντας την εντολή mkfs (make file system). Για παράδειγμα, η έκφραση # /sbin/mkfs /dev/dsk/fl1 512 σημαίνει: δημιουργία σε δισκέτα b: μέγεθος 512 μπλοκ.

Προαιρετικά, μπορείτε να ορίσετε το μέγεθος του συστήματος αρχείων σε μπλοκ και τον αριθμό των i-nodes (δηλ. τον μέγιστο αριθμό αρχείων που μπορούν να αποθηκευτούν στο σύστημα αρχείων). Από προεπιλογή, ο αριθμός των i-nodes είναι ίσος με τον αριθμό των μπλοκ διαιρούμενο με τέσσερα. Ο μέγιστος αριθμός i-nodes σε ένα σύστημα αρχείων είναι 65.000. Εάν για κάποιο λόγο χρειάζεστε περισσότερους από 65.000 i-nodes σε έναν δίσκο, πρέπει να δημιουργήσετε δύο ή περισσότερα συστήματα αρχείων σε αυτόν τον δίσκο.

Οποιοδήποτε σύστημα αρχείων μπορεί να προσαρτηθεί (προσαρτηθεί) σε ένα κοινό δέντρο καταλόγου, σε οποιοδήποτε σημείο του. Για παράδειγμα, ο κατάλογος / είναι ο ριζικός κατάλογος του συστήματος, επιπλέον, είναι η βάση του συστήματος αρχείων, το οποίο είναι πάντα προσαρτημένο. Ο κατάλογος /usr1 βρίσκεται στον κατάλογο /, αλλά σε αυτήν την περίπτωση είναι ένα ξεχωριστό σύστημα αρχείων από το ριζικό σύστημα αρχείων, καθώς όλα τα αρχεία σε αυτόν βρίσκονται σε ξεχωριστό μέρος του δίσκου ή ακόμα και σε ξεχωριστό δίσκο. Το σύστημα αρχείων /usr1 είναι ένα προσαρτημένο σύστημα αρχείων - με ρίζες στο σημείο όπου υπάρχει ο κατάλογος /usr1 στη συνολική ιεραρχία (Εικόνες 1 και 2).

Ρύζι. 1. Σύστημα αρχείων πριν
προσάρτηση /dev/dsk/os1

Ρύζι. 2. Σύστημα αρχείων μετά
προσαρτήστε το /dev/dsk/os1 ως /usr/

Η εντολή /sbin/mount χρησιμοποιείται για την προσάρτηση ενός συστήματος αρχείων. Αυτή η εντολή επιτρέπει στο δεδομένο σύστημα αρχείων να τοποθετηθεί οπουδήποτε στην υπάρχουσα δομή καταλόγου:
Το #/sbin/mount/dev/dsk/osl/usr1 προσαρτά το /dev/dsk/osl στο /usr1
#/sbin/mount/dev/dsk/flt/a προσαρτά το /dev/dsk/flt στο /a

Εάν θέλετε να προσαρτήσετε ένα σύστημα αρχείων σε δίσκους που πρέπει να προστατεύονται από εγγραφή για να γίνει το σύστημα μόνο για ανάγνωση, πρέπει να προσθέσετε την επιλογή -r στην εντολή /sbin/mount.
Ο κατάλογος στον οποίο είναι προσαρτημένο το προσαρτημένο σύστημα αρχείων πρέπει να είναι επί του παρόντος κενός, καθώς τα περιεχόμενά του δεν θα είναι προσβάσιμα κατά την προσάρτηση του συστήματος αρχείων.

Για να λάβετε πληροφορίες σχετικά με συστήματα αρχείων που είναι προσαρτημένα, για παράδειγμα, σε ένα σύστημα LINUX, μπορείτε να χρησιμοποιήσετε την εντολή /sbin/mount χωρίς ορίσματα (Εικόνα 3).

Ρύζι. 3.

Αυτή η εντολή εκτυπώνει τον κατάλογο στον οποίο προσαρτήθηκε το σύστημα αρχείων (π.χ. usrl), τη συσκευή /dev στην οποία βρίσκεται και την ώρα και την ημερομηνία προσάρτησης. Η εντολή /sbin/umount χρησιμοποιείται για την αποπροσάρτηση ενός συστήματος αρχείων, το οποίο είναι το αντίθετο από την εντολή mount. Απελευθερώνει το σύστημα αρχείων και το αφαιρεί από ολόκληρη τη δομή του καταλόγου του, έτσι ώστε όλα τα αρχεία και οι κατάλογοι του να είναι απρόσιτα:
# /sbin/umount /b
# /sbin/umount /dev/dsk/0s2

Δεν είναι δυνατή η αποπροσάρτηση του ριζικού συστήματος αρχείων. Επίσης, η εντολή umount θα αποτύχει εάν κάποιος χρησιμοποιεί ένα αρχείο από το σύστημα αρχείων που αποπροσαρτάται (αυτό θα μπορούσε να είναι τόσο απλό όσο ο χρήστης βρίσκεται σε έναν από τους καταλόγους του συστήματος αρχείων που αποπροσαρτάται).

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

Για φυσικές συσκευές, το LINUX διαθέτει τους καταλόγους dsk και rdsk, οι οποίοι περιέχουν αρχεία που αντιστοιχούν σε συσκευές δίσκου. Συνήθως τα ονόματα αρχείων σε αυτούς τους καταλόγους είναι τα ίδια και η μόνη διαφορά μεταξύ τους είναι ότι ο κατάλογος rdsk περιέχει συσκευές δίσκου με ειδική πρόσβαση (ακατέργαστη), τις οποίες ορισμένες συσκευές συστήματος χρησιμοποιούν για ταχύτερη πρόσβαση στο δίσκο. Ένας τυπικός κατάλογος dsk περιέχει τις ακόλουθες συσκευές:
$ 1s /dev/dsk
0s0 1s0 c0t0d0s0 c0tld0s0 f0 f05q f13dt fld8d
0sl 1sl c0t0d0sl c0tld0sl f03d f05qt f13h fld8dt
0s2 1s2 c0t0d0s2 c0tld0s2 f03dt f0d8d f13ht fld8t
. . .
$

Σε ένα σύστημα LINUX, οι συσκευές δίσκων χωρίζονται λογικά σε διαμερίσματα, παρόμοια με τα διαμερίσματα που ορίζονται στον πίνακα κατατμήσεων του MasterBoot MS DOS. Τα αρχεία 0s1, 0s2, 0s3 κ.λπ. αντιστοιχούν στις ενότητες ένα, δύο, τρία κ.λπ. του αριθμού δίσκου 0. Τα αρχεία 1s0, 1sl, 1s2 κ.λπ. αντιστοιχούν στις ενότητες ένα, δύο, τρία κ.λπ. αριθμός δίσκου 1. Εάν το σύστημα έχει περισσότερους δίσκους, τα διαμερίσματα θα αριθμούνται ns0, nsl, κ.λπ. για κάθε αριθμό δίσκου n.

Συστήματα με πολλές μονάδες δίσκου χρησιμοποιούν το ακόλουθο σύστημα αρίθμησης:
με ελεγκτή d τμήμα δίσκου

όπου ελεγκτής - αριθμός ελεγκτή δίσκου? δίσκος - αριθμός δίσκου? ενότητα - αριθμός ενότητας δίσκου.
Έτσι, το 0s0 είναι συνήθως ισοδύναμο με το c0t0d0s0 και το 0sl είναι το c0t0d0sl και τα ονόματα διαμερισμάτων τριών χαρακτήρων είναι απλώς συντομογραφία του ελεγκτή δίσκου με αριθμό 0.

Τα αρχεία των οποίων τα ονόματα ξεκινούν με f ορίζουν διαφορετικά είδη δισκέτας. Ο κατάλογος rmt περιέχει αρχεία σε συσκευές ταινίας:
$ 1s /dev/rmt
c0s0 cls0 c3s0 ταινία ntapel ταινία ταινία

Τα αρχεία c0s0, cls0, c2s0 και c3s0 ορίζουν τέσσερις συσκευές αποθήκευσης κασετών. Η ταινία και η ταινία αρχείων ορίζουν συσκευές μαγνητικής αποθήκευσης δύο τροχών. Τα αρχεία των οποίων τα ονόματα αρχίζουν με n αναφέρονται στις ίδιες συσκευές, μόνο που η ταινία δεν επανατυλίγεται μετά τη χρήση, ενώ η χρήση άλλων αρχείων προκαλεί την επανατύλιξη της ταινίας όταν τερματίζεται το πρόγραμμα που την χρησιμοποιεί.

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

Το σύστημα αρχείων extX χρησιμοποιεί προσωρινή αποθήκευση δεδομένων για λειτουργίες I/O. Κατά την ανάγνωση ενός μπλοκ πληροφοριών, ο πυρήνας εκδίδει ένα αίτημα λειτουργίας I/O σε πολλά γειτονικά μπλοκ. Τέτοιες λειτουργίες επιταχύνουν σημαντικά την ανάκτηση δεδομένων κατά τη διαδοχική ανάγνωση αρχείων. Κατά την εγγραφή δεδομένων σε ένα αρχείο, το σύστημα αρχείων extX, γράφοντας ένα νέο μπλοκ, τοποθετεί εκ των προτέρων έως και 8 γειτονικά μπλοκ δίπλα-δίπλα. Αυτή η μέθοδος σάς επιτρέπει να τοποθετείτε αρχεία σε συνεχόμενα μπλοκ, γεγονός που επιταχύνει την ανάγνωσή τους και καθιστά δυνατή την επίτευξη υψηλών επιδόσεων του συστήματος.