Question Que fait> / dev / null 2> & 1 || vrai moyen sous Linux?


"command "> /dev/null 2>&1 || true  

Maintenant, je reçois que nous envoyons la sortie d'une commande que nous exécutons, dans un fichier null. J'ai besoin de connaître un sens spécifique pour *2>&1 || true*


4
2018-02-17 12:11


origine




Réponses:


TL; DR:  >/dev/null 2>&1 || true fait taire efficacement la commande, rejetant toute sortie (d'erreur ou normale) et le résultat de la commande, mais aucun de ses effets secondaires. Ce qui suit est une explication de pourquoi.


Les programmes Linux reçoivent par défaut trois descripteurs de fichiers qui sont ouverts avant que le code principal du programme ne commence à s'exécuter. Ceux-ci sont stdin (entrée standard, descripteur de fichier 0), stdout (sortie standard, descripteur de fichier 1) et stderr (erreur standard, descripteur de fichier 2). Celles-ci sont normalement liées au terminal actuel, ce qui signifie aujourd'hui le clavier, l'écran et l'écran, respectivement (mais ce n'était pas toujours le cas).

En spécifiant > /dev/null dans la commande (la redirection peut généralement aller n'importe où dans la commande, mais par convention elle va à la fin ou très rarement au début), vous spécifiez que la sortie standard (implicite 1, mais peut être spécifié en utilisant 1> au lieu de juste >) devrait être redirigé pour écrire à /dev/null, qui rejette tout ce qui lui est écrit.

2>&1 puis redirige le descripteur de fichier 2 (2>) à quel descripteur de fichier 1 est actuellement lié à (&1).

Un raccourci pour quand vous voulez rediriger les deux stdout et stderr au même endroit est d'utiliser &> un péché &> /dev/null. Ce n'est pas supporté dans tous les shells, cependant.

Donc en spécifiant > /dev/null 2>&1 vous dites au système que vous voulez rediriger la sortie standard de la commande dans / dev / null, puis redirigez l'erreur standard dans la sortie standard (qui à son tour est redirigée dans / dev / null). Cela a pour effet de réduire au silence la commande en rejetant toute sa sortie envoyée à stdout ou stderr.

Notez que certains programmes utilisent d'autres moyens de dessiner à l'écran, tels qu'une bibliothèque de terminaux comme ncurses, et ne seront généralement pas affectés par cela ou seront affectés de manière inattendue. Mais pour les programmes écrits pour être utilisés en mode pipe (ce qui inclut la plupart des programmes produisant du texte simple au terminal), cela fonctionne.

le || à son tour signifie que si le programme retourne un état de sortie autre que 0 (où par convention 0 signifie une exécution réussie), le shell invoquera la commande de l’autre côté du ||, qui dans ce cas est true. Ne pas confondre cela avec le tuyau ordinaire, qui utilise un seul | et attache la stdout gauche au stdin droit. L'opposé de || est && qui exécute le côté droit uniquement si le côté gauche renvoie un statut de sortie de 0, et un complément est ; qui sépare simplement plusieurs commandes (la deuxième commande sera exécutée quel que soit le statut de sortie de la première commande).

true, à son tour, est un programme très simple qui a pour seul but de sortir avec un statut réussi. Ce n'est généralement pas très utile en soi, mais peut être très utile par exemple lors de l'écriture de conditions dans des scripts shell. Son opposé est falsequi se termine avec un état d'échec (non nul) mais sinon, comme c'est vrai, ne fait rien.

Donc en ajoutant || true après une commande, vous savez que de toute façon, quelque chose aura exécuté avec succès au moment où cet ensemble de commandes aura fini de s'exécuter. Ainsi, vous savez que le code de statut actuel (disponible dans $?) indiquera toujours une exécution réussie.


9
2018-02-17 12:50





Qu'est-ce que "command"> / dev / null 2> & 1 || vrai moyen sous Linux?

2>&1 signifie "rediriger" STDERR(2) à STDOUT(1)"
(STDERR (Erreur standard) a un descripteur de fichier prédéfini égal à 2
et STDOUTLe descripteur de fichier (sortie standard) est égal à 1)

> - est le même que 1> et signifie rediriger STDOUT de quelque chose

Ensuite, toute l'opération sera traduite par:

command > /dev/null 2>&1 - rediriger les descripteurs de fichiers STDOUT et STDERR vers le "trou noir" ou ignorer fondamentalement toutes les sorties de command
("trou noir" ou /dev/null est un périphérique spécial qui accepte les entrées et les ignore en interne)

En ce qui concerne || true - Si command retourne un statut de sortie non 0 (zéro) (cela indique généralement un type d'erreur / échec), puis true forcer définir le code de statut de sortie à 0 (zéro) indiquant le succès.


1
2018-02-17 12:17



Plus précisément, 2>&1 signifie "rediriger STDERR (2) à STDOUT (1) ". - quixotic
@quixotic Merci! Ajout de votre note à la réponse. - Alex