5 votes

Que signifie > /dev/null 2>&1 || true en Linux?

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

Maintenant, je comprends que nous envoyons la sortie d'une commande que nous exécutons vers un fichier nul. J'ai besoin de connaître la signification spécifique de *2>&1 || true*

13voto

user Points 28521

TL;DR: >/dev/null 2>&1 || true permet de silencier efficacement la commande, en jetant toutes les sorties (erreurs ou normales) et le résultat de la commande, mais pas ses effets secondaires. Ce qui suit explique 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. Il s'agit de stdin (entrée standard, descripteur de fichier 0), stdout (sortie standard, descripteur de fichier 1) et stderr (erreur standard, descripteur de fichier 2). Ils sont normalement liés au terminal actuel, qui représente aujourd'hui effectivement 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 se faire n'importe où dans la commande, mais par convention, elle se place à la fin ou très rarement au début), vous spécifiez que la sortie standard (1 implicite, mais peut être spécifiée en utilisant 1> au lieu de simplement >) doit être redirigée pour écrire vers /dev/null, qui supprime tout ce qui y est écrit.

2>&1 redirige ensuite le descripteur de fichier 2 (2>) vers ce que le descripteur 1 est actuellement lié (&1).

Un raccourci lorsque vous voulez rediriger à la fois stdout et stderr vers le même endroit est d'utiliser &> comme dans &> /dev/null. Ceci n'est cependant pas supporté dans tous les shells.

Ainsi, en spécifiant > /dev/null 2>&1, vous indiquez au système que vous voulez rediriger la sortie standard de la commande vers /dev/null, puis rediriger l'erreur standard vers la sortie standard (qui est à son tour redirigée vers /dev/null). Cela a pour effet de silencer la commande en jetant toutes ses sorties envoyées soit à stdout soit à stderr.

Notez que certains programmes utilisent des moyens alternatifs pour dessiner à l'écran, comme une bibliothèque de terminal comme ncurses, et ne seront généralement pas affectés par cela ou le seront de manière inattendue. Mais pour les programmes écrits pour être utilisés de manière pipe (ce qui inclut la plupart des programmes qui produisent un texte simple sur le terminal), cela fonctionne.

Le || signifie alors que si le programme renvoie un code de sortie autre que 0 (où par convention 0 signifie une exécution réussie), alors le shell invoquera la commande de l'autre côté du ||, qui dans ce cas est true. Ne confondez pas cela avec le tuyau ordinaire, qui utilise un seul | et lie la sortie standard de gauche à l'entrée standard de droite. L'opposé de || est && qui exécute le côté droit uniquement si le côté gauche renvoie un code de sortie de 0, et un complément est ; qui simplement sépare plusieurs commandes (la seconde commande sera exécutée indépendamment du code de sortie de la première commande).

true, à son tour, est un programme très simple dont le seul but est de sortir avec un statut de réussite. Il n'est généralement pas très utile en lui-même, mais peut être très utile par exemple lors de l'écriture de conditionnels dans des scripts shell. Son opposé est false qui sort avec un statut d'échec (non nul) mais qui, autrement, comme true, ne fait rien.

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

4voto

Alex Points 6039

Que signifie "commande " > /dev/null 2>&1 || true" en Linux?

2>&1 signifie "rediriger STDERR(2) vers STDOUT(1)"
(STDERR (Standard Error) a un descripteur de fichier prédéfini égal à 2
et le descripteur de fichier de STDOUT (Standard output) est égal à 1)

> - est la même chose que 1> et signifie rediriger STDOUT vers quelque chose

Alors l'opération entière sera traduite comme suit:

command > /dev/null 2>&1 - redirige les descripteurs de fichier STDOUT et STDERR vers le "trou noir" ou ignore essentiellement toutes les sorties de la commande
("trou noir" ou /dev/null est un dispositif spécial qui accepte les entrées et les ignore internalement)

En ce qui concerne || true - Si la commande renvoie un code de sortie non nul (zéro) (ce qui indique généralement un type d'erreur/échec) alors true forcera le code de sortie à 0 (zéro) indiquant le succès.

1 votes

Plus précisément, 2>&1 signifie "rediriger STDERR (2) vers STDOUT (1)".

0 votes

@quixotic Merci ! J'ai ajouté votre note à la réponse.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X