Τι είναι stdin, stderr και stdout στο Bash

What Are Stdin Stderr



Κάθε φορά που εκτελείτε οποιαδήποτε εντολή στο τερματικό, stdin , stderr , και stdout είναι τρεις ροές δεδομένων που δημιουργεί το bash. Εάν είστε εξοικειωμένοι με τη γραμμή εντολών, ίσως έχετε ήδη εκμεταλλευτεί αυτές τις δυνατότητες. Ουσιαστικά, επιτρέπουν τη διοχέτευση/ανακατεύθυνση δεδομένων από τη μια εντολή στην άλλη.

Ας δούμε πώς stdin , stderr , και stdout λειτουργεί και πώς μπορείτε να τα χρησιμοποιήσετε επίσης.







stdin, stdout και stderr

Στην πληροφορική, ο όρος ροή αναφέρεται σε κάτι που μπορεί να μεταφέρει δεδομένα. Εδώ, και οι τρεις ροές μεταφέρουν κείμενο ως δεδομένα.



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



Ας έχουμε μια γρήγορη ανάλυση των ειδικών ροών.





  • stdin: Σημαίνει την τυπική είσοδο. Παίρνει κείμενο ως είσοδο.
  • stdout: Υποστηρίζει την τυπική έξοδο. Η έξοδος κειμένου μιας εντολής αποθηκεύεται στη ροή stdout.
  • stderr: Σημαίνει τυπικό σφάλμα. Κάθε φορά που μια εντολή αντιμετωπίζει σφάλμα, το μήνυμα σφάλματος αποθηκεύεται σε αυτήν τη ροή.

Στο Linux, σχεδόν όλες οι ροές αντιμετωπίζονται σαν να είναι αρχεία. Ακριβώς όπως μπορείτε να διαβάσετε/γράψετε ένα αρχείο, μπορείτε να διαβάσετε/γράψετε δεδομένα από αυτές τις ροές.

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



  • 0: stdin
  • 1: stdout
  • 2: stderr

stdin, stdout και stderr εν δράσει

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

Εκτελέστε την ακόλουθη εντολή.

$ανάγνωση

Η εντολή θα απαιτήσει εισαγωγή από το πληκτρολόγιο. Εδώ, το εργαλείο ανάγνωσης λαμβάνει την είσοδο από το stdin. Ας δούμε τώρα το stdout.

Εκτελέστε πρώτα την εντολή.

$ls -ο

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

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

$ls -οΟτιδήποτε

Εδώ, δεν υπάρχει κανένα αρχείο με όνομα. Αυτός είναι ο λόγος για τον οποίο αποστέλλεται το μήνυμα ls επιστρέφει stderr Το

Σωλήνωση

Αυτή είναι μια κοινή τεχνική που αξιοποιεί πλήρως τα ρεύματα stdin και stdout. Ας το εξηγήσουμε με ένα παράδειγμα.

$πέταξε έξω 'Γειά σου Κόσμε' | λαβήγεια σας

Εδώ, το | η πινακίδα είναι υπεύθυνη για τις σωληνώσεις. Η έξοδος πέταξε έξω παράγει είναι γραμμένο στο stdout ρεύμα. Στη συνέχεια, η σωλήνωση ανακατευθύνει το περιεχόμενο του stdout στο stdin για την εντολή grep. Έτσι ο grep γνωρίζει σε ποιο περιεχόμενο θα εκτελέσει τη λειτουργία.

Εάν θέλετε να μεταφέρετε και το stderr και το stdout στην επόμενη εντολή, χρησιμοποιήστε το | & αντ 'αυτού.

$πέταξε έξωΓειά σου Κόσμε| & Γάτα

$Οτιδήποτε| & Γάτα

Ανακατεύθυνση ροών

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

Για να ανακατευθύνετε το περιεχόμενο stdout σε ένα αρχείο, προσθέστε τη γωνία> ακολουθούμενη από το όνομα του αρχείου προορισμού.

$πέταξε έξωΓειά σου Κόσμε>>hello.txt

Εδώ, η έξοδος της εντολής echo θα αποθηκευτεί στο αρχείο hello.txt.

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

$πέταξε έξω 'Γειά σου Κόσμε' >>hello.txt

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

Σε αυτήν την εντολή, η γάτα θα λάβει την είσοδό της απευθείας από το αρχείο hello.txt.

$Γάτα <hello.txt

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

$# pyin.py
$ name= εισαγωγή('Εισαγάγετε όνομα n')
$ΗΛΕΚΤΡΟΝΙΚΗ ΔΙΕΥΘΥΝΣΗ = εισαγωγή('Εισάγετε ηλεκτρονική διεύθυνση n')
$Τυπώνω('Το όνομά σας είναι %s και το email είναι %s'%(όνομα, ΗΛΕΚΤΡΟΝΙΚΗ ΔΙΕΥΘΥΝΣΗ))

Η είσοδος για το σενάριο βρίσκεται στο hello.txt.

$Γάταhello.txt

Ας στείλουμε το αρχείο ως είσοδο για το σενάριο.

$ python3 pyin.py <γεια σας.κείμενο

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

$ python3 pyin.py <γεια σας.κείμενο >>παραγωγή.κείμενο

Η ανακατεύθυνση του stderr είναι παρόμοια με το stdout. Ωστόσο, πρέπει να αναφέρετε την περιγραφή ID 2 για ένδειξη stderr. Διαφορετικά, θα χρησιμοποιήσει απλώς το stdout.

Εδώ, θα ανακατευθύνω το περιεχόμενο του stderr σε αρχείο κειμένου.

$Οτιδήποτε2>>error.txt

Ανακατεύθυνση Stdout και Stderr

Ναι, είναι δυνατή η ανακατεύθυνση και των δύο ταυτόχρονα. Το μόνο που χρειάζεστε είναι να αναφέρετε την περιγραφή ID 1 και 2 πριν από την ανακατεύθυνση.

$πέταξε έξωΓειά σου Κόσμε1>>output.log2>>debug.log

Τελικές σκέψεις

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

Θέλετε να μάθετε περισσότερα σχετικά με το σενάριο bash; Ας ξεκινήσουμε με αυτό Οδηγός για αρχάριους για bash scripting !

Απολαμβάνω!