Comment exécuter une commande en arrière-plan sans sortie sauf s'il y a une erreur?
Si vous êtes une personne occupée, la dernière chose dont vous avez besoin est d’être dérangé par une quantité énorme de notifications «inutiles». Alors, comment pouvez-vous calmer les choses? Aujourd'hui, le Q & A SuperUser post a d'excellentes réponses pour aider un lecteur à réduire la quantité de sortie.
La séance de questions et réponses d'aujourd'hui nous est offerte par SuperUser, une sous-division de Stack Exchange, un groupe de sites Web de questions-réponses dirigé par la communauté..
La question
Le lecteur SuperUser Xster veut savoir comment exécuter une commande en arrière-plan sans sortie sauf s'il y a une erreur:
Comment pouvez-vous supprimer le résultat d'une commande, mais l'afficher si le code de sortie de la commande génère une erreur?
Comment obtenir une commande à exécuter en arrière-plan sans sortie sauf en cas d'erreur?
La réponse
Les contributeurs SuperUser, Bob et Maximillian Laumeister, ont la solution pour nous. Tout d'abord, Bob:
Malheureusement, l'hypothèse selon laquelle stderr n'est utilisé que pour la sortie d'erreur n'est pas toujours correct. Plutôt, stderr est souvent utilisé pour toutes les sorties et diagnostics interactifs (c'est-à-dire une sortie destinée à l'utilisateur à lire dans une invite interactive).(1) wget et jj sont des exemples bien connus.
Certaines commandes fourniront un drapeau (i.e. -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 retourne un code de sortie quand il se ferme. Typiquement(2), un code de sortie de 0 indique un 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 du $? variable. Dans poisson, Utilisez le $ status variable. Vous pouvez pipe stderr dans un fichier temporaire et imprimez-le uniquement en cas d'erreur. Par exemple (poisson):
Vous pouvez également utiliser certains raccourcis si vous n'enchaînez pas de commandes:
Ou:
Vous pouvez aussi diriger stdout dans le même tampon en utilisant 2> & 1> / tmp / outputbuffer.
(Remarque: Je ne sais pas vraiment poisson, J'adapte donc le concept à ce que je peux trouver dans sa documentation. La syntaxe est peut-être légèrement incorrecte. En outre, vous pouvez utiliser mktemp 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 tout le travail à l'arrière-plan d'un shell que vous utilisez également de manière interactive en même temps, il est préférable d'écrire un script pour gérer le masquage de sortie et d'exécuter ce script en arrière-plan avec les techniques standard. (poisson). Heck, vous pouvez mettre quelque chose comme la fonction suivante dans ~ / .config / fish / config.fish:
Appeler avec run-silent somecommand & (où la fuite Et provoque son exécution en arrière-plan)
Notez que ceci avalera le code de sortie original et videra les deux stdout et stderr en cas d'échec. Vous pouvez le personnaliser si nécessaire.
(1) Il n'y a aucune garantie que la sortie d'erreur n'apparaisse pas sur stdout, certains programmes y videront toutes les sorties!
(2) Malheureusement, ce n'est pas toujours le cas. Le code de sortie est entièrement contrôlé par le programme et certains indiqueront des conditions de réussite 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 voulons seulement voir les messages d'erreur, alors il suffira de supprimer stdout de sorte que seulement stderr obtient la sortie sur la console.
La façon de le faire (dans les deux frapper et poisson) est à ajouter > / dev / null à la commande. Cette pipes stdout dans le néant, mais stderr (avec vos messages d'erreur) parvient toujours à travers la console.
Donc par exemple:
La commande echo 1> / dev / null imprime rien, parce que la normale stdout la sortie est supprimée et rien n'a été écrit stderr.
La commande man doesnotexist> / dev / null affiche un message d'erreur, car homme écrit son message d'erreur à stderr.
Avez-vous quelque chose à ajouter à l'explication? Sound off dans les commentaires. Voulez-vous lire plus de réponses d'autres utilisateurs de Stack Exchange doués en technologie? Découvrez le fil de discussion complet ici.