19Aug

Πώς εκτελείτε μια εντολή στο παρασκήνιο χωρίς έξοδο, εκτός αν υπάρχει κάποιο σφάλμα;

Εάν είστε απασχολημένος, τότε το τελευταίο πράγμα που χρειάζεστε είναι να ενοχλείτε με ένα τεράστιο ποσό «άχρηστων» ειδοποιήσεων, έτσι πώς μπορείτε να χαλαρώσετε τα πράγματα κάτω;Η σημερινή θέση SuperUser Q & A έχει μερικές μεγάλες απαντήσεις για να βοηθήσει έναν αναγνώστη να μειώσει την ποσότητα της παραγωγής.

Η σημερινή ερώτηση &Η συνάντηση απαντήσεων έρχεται με την ευγένεια του SuperUser - μια υποδιαίρεση του Stack Exchange, μια κοινότητα-καθοδηγούμενη ομαδοποίηση Q & A ιστοσελίδες.

Η ερώτηση

Reader SuperUser Το Xster θέλει να μάθει πώς να τρέχει μια εντολή στο παρασκήνιο χωρίς έξοδο εκτός αν υπάρχει κάποιο σφάλμα:

Πώς καταργείτε την έξοδο μιας εντολής, αλλά την εμφανίζετε αν η έξοδος της εντολής κωδικοποιεί ένα σφάλμα;

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

Οι συνεισφέροντες της απάντησης

SuperUser Bob και Maximillian Laumeister έχουν την απάντηση για εμάς.Αρχικά, ο Bob:

Δυστυχώς, η υπόθεση ότι το stderr

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

Ορισμένες εντολές θα παρέχουν μια σημαία( δηλαδή -απόκριση ή -silent ) για την καταστολή της εξόδου μη σφάλματος.Διαβάστε τις σελίδες του ανθρώπου για να δείτε αν υπάρχει.

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

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

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

Ή:

Μπορείτε επίσης να διοχετεύσετε stdout στο ίδιο buffer χρησιμοποιώντας το 2 & gt;/tmp/ outputbuffer .

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

Εάν θέλετε να εκτελέσετε ολόκληρο το αντικείμενο στο παρασκήνιο ενός κελύφους που χρησιμοποιείτε ταυτόχρονα και διαδραστικά ταυτόχρονα, τότε καλύτερα να γράψετε ένα σενάριο για χειρισμότην έξοδο-απόκρυψη και την εκτέλεση αυτού του σεναρίου στο παρασκήνιο με τις τυπικές τεχνικές( fish ).Heck, μπορείτε να βάλετε κάτι σαν την ακόλουθη συνάρτηση στο ~ /.config/fish/ config.fish :

Καλέστε με run-silent somecommand &( όπου το τελευταίο & την προκαλεί να τρέχει στο παρασκήνιο)

Σημειώστε ότι αυτό θα καταπιεί τον αρχικό κωδικό εξόδου και θα χρεώνει τόσο stdout όσο και stderr σε περίπτωση βλάβης.Μπορείτε να το προσαρμόσετε όπως είναι απαραίτητο.

( 1) Δεν υπάρχει εγγύηση ότι η έξοδος σφάλματος δεν θα εμφανιστεί στο stdout , μερικά προγράμματα θα σβήσουν όλη την έξοδο εκεί!

( 2) Δυστυχώς, αυτό δεν συμβαίνει πάντοτε.Ο κωδικός εξόδου ελέγχεται πλήρως από το πρόγραμμα και ορισμένοι θα υποδείξουν κάποιες συνθήκες επιτυχίας με μη μηδενικές εξόδους.Πάλι, ελέγξτε το εγχειρίδιο.

Ακολουθούμενη από την απάντηση του Maximillian Laumeister:

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

Ο τρόπος για να γίνει αυτό( και στις δύο bash και ψάρια ) είναι να επισυνάψετε & gt;/dev/ null στην εντολή.Αυτό το σωλήνα stdout σε τίποτα, αλλά stderr ( με τα μηνύματά σας λάθους) εξακολουθεί να έρχεται στην κονσόλα.

Για παράδειγμα:

Η εντολή echo 1 & gt;Το /dev/ null δεν εκτυπώνει τίποτα, επειδή η κανονική έξοδος stdout καταστέλλεται και τίποτα δεν γράφτηκε στον stderr .

Η εντολή man doesnotexist & gt;/dev/ null εκτυπώνει ένα μήνυμα σφάλματος, επειδή ο άνθρωπος γράφει το μήνυμα σφάλματος του stderr .

Έχετε κάτι να προσθέσετε στην εξήγηση;Απενεργοποιήστε τα σχόλια.Θέλετε να διαβάσετε περισσότερες απαντήσεις από άλλους χρήστες τεχνολογίας Stack Exchange;Δείτε το πλήρες νήμα συζήτησης εδώ.