19Aug

Comment exécutez-vous une commande en arrière-plan avec aucune sortie à moins qu'il y ait une erreur?

Si vous êtes une personne occupée, alors 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 SuperUser Q & A d'aujourd'hui a quelques bonnes réponses pour aider un lecteur à réduire la quantité de sortie.

Question d'aujourd'hui &La session de réponse nous est offerte par SuperUser, une subdivision de Stack Exchange, un regroupement communautaire de sites Web Q & A.

La question

SuperUser lecteur Xster veut savoir comment exécuter une commande en arrière-plan sans sortie, sauf s'il y a une erreur:

Comment supprimer la sortie d'une commande, mais montrer si la sortie de la commande code une erreur?

Comment obtenez-vous une commande pour exécuter en arrière-plan sans sortie, sauf s'il y a une erreur?

La réponse

SuperUser contributeurs Bob et Maximillian Laumeister ont la réponse pour nous. Tout d'abord, Bob:

Malheureusement, l'hypothèse selon laquelle stderr est seulement utilisée pour la sortie d'erreur n'est pas toujours correcte. Plutôt,

stderr est souvent utilisé pour tous les résultats et diagnostics interactifs( c'est-à-dire la sortie destinée à l'utilisateur à lire dans une invite interactive).( 1) wget et dd sont des exemples bien connus.

Certaines commandes fournissent un indicateur( par exemple -quiet ou -silent ) pour supprimer la sortie sans erreur. Lisez leurs pages man pour voir s'il en existe une.

Une autre convention qui tient plus souvent est le code de sortie , un programme retourne un code de sortie quand il se termine. Typiquement ( 2) , un code de sortie de 0 indique le succès, et tout autre code de sortie indique une erreur.

Avec bash , vous pouvez obtenir le code de sortie de la dernière commande de l' $? variable. Dans fish , utilisez la variable $ .Vous pouvez diriger stderr vers un fichier temporaire et l'imprimer uniquement si une erreur se produit. Par exemple( fish ):

Vous pouvez également utiliser des raccourcis si vous n'êtes pas en train de chaîner des commandes:

Ou:

Vous pouvez également rediriger stdout vers le même tampon en utilisant 2 & gt; & 1 & gt;/tmp/ outputbuffer .

( Note: Je ne connais pas poisson , donc j'adapte le concept à ce que je peux trouver dans sa documentation. La syntaxe peut être légèrement fausse. En outre, vous pouvez utiliser mktemp pour générer un unique temporairefichier Exécutez-le et enregistrez le nom du fichier dans une variable.)

Si vous devez exécuter tout le contenu en arrière-plan d'un shell que vous utilisez simultanément en même temps, il vaut mieux écrire un script à gérerla sortie-cacher et 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 : Appel

avec run-silent somecommand &( où l' et l' de fin le font fonctionner en arrière-plan)

Notez que cela va avaler le code de sortie d'origine, et videra 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'apparaîtra pas sur stdout , certains programmes y déverseront toutes les sorties!

( 2) Malheureusement, ce n'est toujours pas 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, vérifiez 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 pour queSeul stderr obtient une sortie vers la console.

La manière de faire ceci( dans bash et poisson ) est d'ajouter & gt;/dev/ null à la commande. Cela conduit stdout dans le néant, mais stderr ( avec vos messages d'erreur) parvient toujours à la console.

Donc par exemple:

La commande echo 1 & gt;/dev/ null n'affiche rien car la sortie standard stdout est supprimée et rien n'a été écrit dans stderr .

La commande man doesnotexist & gt;/dev/ null affiche un message d'erreur, car man écrit son message d'erreur sur stderr .

Avoir quelque chose à ajouter à l'explication? Sonnez dans les commentaires. Vous voulez lire plus de réponses d'autres utilisateurs de Stack Exchange? Découvrez le fil de discussion complet ici.