Si vous êtes une personne occupée, la dernière chose dont vous avez besoin est d’être dérangé par une énorme quantité de notifications « inutiles », alors comment calmer les choses? Le post de questions-réponses des super-utilisateurs d’aujourd’hui contient d’excellentes réponses pour aider un lecteur à réduire la quantité de sortie.
La session de questions et réponses d’aujourd’hui nous est offerte par SuperUser, une subdivision de Stack Exchange, un regroupement communautaire de sites Web de questions-réponses.
La question
Le lecteur SuperUser Xster veut savoir comment exécuter une commande en arrière-plan sans sortie sauf en cas d’erreur:
Comment supprimer la sortie d’une commande, mais l’afficher si la sortie de la commande code une erreur?
Comment faire exécuter une commande en arrière-plan sans sortie, sauf en cas d’erreur?
La réponse
Les contributeurs SuperUser Bob et Maximillian Laumeister ont la réponse pour nous. Tout d’abord, Bob:
Malheureusement, l’hypothèse selon laquelle stderr est utilisé uniquement pour la sortie d’erreur n’est pas toujours correcte. Plutôt, stderr est souvent utilisé pour toutes les sorties et diagnostics interactifs (c’est-à-dire la sortie destinée à être lue par l’utilisateur dans une invite interactive).(1) wget et jj sont des exemples bien connus.
Certaines commandes fourniront un drapeau (ie -silencieux ou -silencieux) pour supprimer la sortie sans erreur. Lisez leurs pages de manuel pour voir s’il en existe une.
Une autre convention qui tient plus souvent est la code de sortie, un programme renvoie un code de sortie à sa sortie. Typiquement(2), un code de sortie de 0 indique le succès et tout autre code de sortie indique une erreur.
Avec frapper, vous pouvez obtenir le code de sortie de la dernière commande à partir du $? variable. Dans poisson, Utilisez le $ status variable. Vous pouvez canaliser stderr dans un fichier temporaire et ne l’imprimer qu’en cas d’erreur. Par exemple (poisson):
Vous pouvez également utiliser certains raccourcis si vous ne chaînez pas les commandes:
Ou:
Vous pouvez également canaliser stdout dans le même tampon en utilisant 2> & 1> / tmp / tampon de sortie.
(Remarque: Je ne sais pas vraiment poisson, j’adapte donc le concept à ce que je peux trouver dans sa documentation. La syntaxe peut être légèrement erronée. En outre, vous pouvez utiliser mktemp pour générer un fichier temporaire unique. Exécutez-le et enregistrez le nom du fichier dans une variable.)
Si vous avez besoin d’exécuter le tout en arrière-plan d’un shell que vous utilisez également de manière interactive en même temps, vous feriez mieux d’écrire un script pour gérer le masquage de la sortie et d’exécuter ce script en arrière-plan avec le techniques standard (poisson). Heck, vous pouvez mettre quelque chose comme la fonction suivante dans ~ / .config / fish / config.fish:
Appeler avec exécuter une commande silencieuse et (où le dernier & le fait fonctionner en arrière-plan)
Notez que cela avalera le code de sortie d’origine et videra les deux stdout et stderr en cas de panne. Vous pouvez le personnaliser si nécessaire.
(1) Il n’y a aucune garantie que la sortie d’erreur n’apparaîtra pas sur stdout, certains programmes y videront toutes les sorties!
(2) Malheureusement, ce n’est toujours pas toujours le cas. Le code de sortie est entièrement contrôlé par le programme et certains indiqueront des conditions de succès avec des sorties non nulles. Encore une fois, consultez le manuel.
Suivi de la réponse de Maximillian Laumeister:
Les utilitaires Unix envoient des messages généraux à stdout, et des messages d’erreur à stderr, donc si nous ne voulons voir que les messages d’erreur, alors il suffira de supprimer stdout de sorte que seulement stderr obtient la sortie vers la console.
La façon de procéder (dans les deux frapper et poisson) est d’ajouter > / dev / null à la commande. Ce tuyaux stdout dans le néant, mais stderr (avec vos messages d’erreur) parvient toujours à la console.
Donc par exemple:
La commande echo 1> / dev / null n’imprime rien, car le normal stdout la sortie est supprimée et rien n’a été écrit stderr.
La commande l’homme n’existe pas> / dev / null imprime un message d’erreur, car homme écrit son message d’erreur dans stderr.
Avez-vous quelque chose à ajouter à l’explication? Sonnez dans les commentaires. Vous voulez lire plus de réponses d’autres utilisateurs de Stack Exchange férus de technologie? Consultez le fil de discussion complet ici.
Soutenez notre effort ❤️
Si vous avez apprécié cet article, pensez à laisser un pourboire pour nous aider à continuer à publier du contenu de qualité.


























