Πώς εκτελείτε μια εντολή στο παρασκήνιο χωρίς καμία έξοδο, εκτός αν υπάρχει κάποιο σφάλμα;
Εάν είστε πολυάσχολους, τότε το τελευταίο πράγμα που χρειάζεστε είναι να ενοχλείτε με ένα τεράστιο ποσό «άχρηστων» ειδοποιήσεων, έτσι πώς μπορείτε να χαλαρώσετε τα πράγματα κάτω; Η σημερινή θέση Q & A της SuperUser έχει μερικές εξαιρετικές απαντήσεις για να βοηθήσει έναν αναγνώστη να μειώσει την ποσότητα της παραγωγής.
Η σημερινή συνάντηση ερωτήσεων και απαντήσεων έρχεται σε επαφή με το SuperUser - μια υποδιαίρεση του Stack Exchange, μια κοινότητα που κατευθύνεται από τους ιστότοπους ερωτήσεων & απαντήσεων.
Το ερώτημα
Ο αναγνώστης SuperUser Xster θέλει να μάθει πώς να τρέχει μια εντολή στο παρασκήνιο χωρίς έξοδο εκτός αν υπάρχει κάποιο σφάλμα:
Πώς καταργείτε την έξοδο μιας εντολής, αλλά δείξτε εάν η έξοδος της εντολής κωδικοποιεί ένα σφάλμα?
Πώς παίρνετε μια εντολή να τρέχει στο παρασκήνιο χωρίς έξοδο αν δεν υπάρχει κάποιο σφάλμα?
Η απάντηση
Οι συνδρομητές του SuperUser Bob και Maximillian Laumeister έχουν την απάντηση για εμάς. Πρώτα επάνω, ο Μπομπ:
Δυστυχώς, η υπόθεση αυτή stderr χρησιμοποιείται μόνο για την έξοδο σφάλματος δεν είναι πάντα σωστή. Μάλλον, stderr χρησιμοποιείται συχνά για οποιαδήποτε και όλες τις διαδραστικές έξοδοι και διαγνωστικά (δηλ. εξόδου που προορίζεται για το χρήστη να διαβάζει σε μια διαλογική ερώτηση).(1) wget και dd είναι πολύ γνωστά παραδείγματα.
Ορισμένες εντολές θα παρέχουν μια σημαία (δηλ. -ησυχια ή -σιωπηλός) για να καταστείλει την έξοδο χωρίς σφάλματα. Διαβάστε τις σελίδες του ανθρώπου για να δείτε αν υπάρχει.
Μια άλλη σύμβαση που κρατά πιο συχνά είναι η κωδικό εξόδου, ένα πρόγραμμα επιστρέφει έναν κωδικό εξόδου όταν εξέρχεται. Τυπικά(2), κωδικό εξόδου 0 υποδεικνύει επιτυχία και οποιοσδήποτε άλλος κωδικός εξόδου υποδεικνύει σφάλμα.
Με κτυπώ δυνατά, μπορείτε να πάρετε τον κωδικό εξόδου της τελευταίας εντολής από το $? μεταβλητός. Σε ψάρι, Χρησιμοποιήστε το $ status μεταβλητός. Μπορείτε να διοχετεύσετε stderr σε ένα προσωρινό αρχείο και να το εκτυπώσετε μόνο σε περίπτωση εμφάνισης σφάλματος. Για παράδειγμα (ψάρι):
Μπορείτε επίσης να χρησιμοποιήσετε μερικές συντομεύσεις εάν δεν είστε εντολές αλυσοποίησης:
Ή:
Μπορείτε επίσης να διοχετεύσετε stdout στο ίδιο buffer χρησιμοποιώντας 2> & 1> / tmp / outputbuffer.
(Σημείωση: Δεν ξέρω πραγματικά ψάρι, έτσι προσαρμόζω την έννοια σε αυτό που μπορώ να βρω στην τεκμηρίωσή της. Η σύνταξη μπορεί να είναι ελαφρώς λανθασμένη. Επίσης, μπορείτε να χρησιμοποιήσετε mktemp για να δημιουργήσετε ένα μοναδικό προσωρινό αρχείο. Εκτελέστε το και καταγράψτε το όνομα του αρχείου σε μια μεταβλητή.)
Εάν θέλετε να εκτελέσετε το όλο θέμα στο παρασκήνιο ενός κελύφους που χρησιμοποιείτε ταυτόχρονα και αλληλεπιδραστικά, τότε είναι καλύτερα να γράψετε ένα σενάριο για να χειριστείτε την έξοδο-απόκρυψη και να τρέξετε το σενάριο στο παρασκήνιο με τις τυπικές τεχνικές (ψάρι). Heck, μπορείτε να βάλετε κάτι σαν την ακόλουθη λειτουργία ~ / .config / fish / config.fish:
Καλέστε με run-silent somecommand & (όπου το τελικό & & προκαλεί την εκτέλεση του στο παρασκήνιο)
Σημειώστε ότι αυτό θα καταπιεί τον αρχικό κώδικα εξόδου και θα πετάξει και τα δύο stdout και stderr σε περίπτωση αποτυχίας. Μπορείτε να το προσαρμόσετε όπως είναι απαραίτητο.
(1) Δεν υπάρχει εγγύηση ότι η έξοδος σφαλμάτων δεν θα εμφανιστεί stdout, μερικά προγράμματα θα πετάξουν όλη την παραγωγή εκεί!
(2) Δυστυχώς, αυτό δεν συμβαίνει πάντα. Ο κωδικός εξόδου ελέγχεται πλήρως από το πρόγραμμα και ορισμένοι θα υποδείξουν κάποιες συνθήκες επιτυχίας με μη μηδενικές εξόδους. Πάλι, ελέγξτε το εγχειρίδιο.
Ακολουθούμενη από την απάντηση του Maximillian Laumeister:
Τα βοηθητικά προγράμματα Unix στέλνουν γενικά μηνύματα στο stdout, και μηνύματα σφάλματος σε stderr, οπότε αν θέλουμε μόνο να βλέπουμε μηνύματα σφάλματος, τότε θα είναι αρκετό να καταστείλει stdout έτσι ώστε μόνο stderr παίρνει έξοδο στην κονσόλα.
Ο τρόπος για να γίνει αυτό (και στα δύο κτυπώ δυνατά και ψάρι) είναι να προστεθεί > / dev / null στην εντολή. Αυτές οι σωληνώσεις stdout σε τίποτα, αλλά stderr (με τα μηνύματά σας) εξακολουθεί να έρχεται στην κονσόλα.
Για παράδειγμα:
Η εντολή echo 1> / dev / null δεν εκτυπώνει τίποτα, επειδή το κανονικό stdout η έξοδος καταστέλλεται και δεν γράφτηκε τίποτα stderr.
Η εντολή ο χρήστης doesnotexist> / dev / null εκτυπώνει ένα μήνυμα σφάλματος, επειδή άνδρας γράφει το μήνυμα σφάλματος του stderr.
Έχετε κάτι να προσθέσετε στην εξήγηση; Απενεργοποιήστε τα σχόλια. Θέλετε να διαβάσετε περισσότερες απαντήσεις από άλλους τεχνολογικούς χρήστες Stack Exchange; Δείτε το πλήρες νήμα συζήτησης εδώ.