"command "> /dev/null 2>&1 || true
Maintenant, je comprends que nous envoyons la sortie d'une commande que nous exécutons, vers un fichier null. J'ai besoin de savoir la signification spécifique de *2>&1 || true*
"command "> /dev/null 2>&1 || true
Maintenant, je comprends que nous envoyons la sortie d'une commande que nous exécutons, vers un fichier null. J'ai besoin de savoir la signification spécifique de *2>&1 || true*
TL;DR: >/dev/null 2>&1 || true
désactive efficacement la commande, en jetant toute sortie (erreur ou normale) et le résultat de la commande, mais pas 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. Ce sont 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 aujourd'hui signifie 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 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ée en utilisant 1>
au lieu de simplement >
) doit être redirigée pour écrire dans /dev/null
, qui jette tout ce qui y est écrit.
2>&1
redirige ensuite le descripteur de fichier 2 (2>
) vers ce à quoi le descripteur de fichier 1 est actuellement lié (&1
).
Un raccourci lorsque vous voulez rediriger à la fois stdout
et stderr
au même endroit est d'utiliser &>
comme dans &> /dev/null
. Cependant, cela n'est pas pris en charge dans tous les shells.
Ainsi, en spécifiant > /dev/null 2>&1
, vous indiquez au système que vous souhaitez 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 désactiver la commande en jetant toute sa sortie qui est envoyée soit à stdout, soit à stderr.
Remarquez que certains programmes utilisent des moyens alternatifs pour dessiner à l'écran, tels qu'une bibliothèque de terminal 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 conçus pour être utilisés de manière pipe (ce qui inclut la plupart des programmes qui produisent un texte simple dans le terminal), cela fonctionne.
Le ||
signifie à son tour que si le programme renvoie un code de sortie différent de 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 simple pipe, qui utilise un seul |
et relie stdout du côté gauche à stdin du côté droit. L'opposé de ||
est &&
, qui exécute le côté droit seulement si le côté gauche renvoie un code de sortie de 0, et une commande complémentaire est ;
, qui sépare simplement plusieurs commandes (la deuxième 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 se terminer avec un statut de succès. Il n'est généralement pas très utile en soi, mais peut être très utile par exemple lors de l'écriture de conditionnels dans des scripts shell. Son opposé est false
qui se termine avec un échec (statut non nul) mais sinon, 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ée avec succès au moment où cet ensemble de commandes aura fini son exécution. Vous savez donc que le code de statut actuel (disponible dans $?
) indiquera toujours une exécution réussie.
Que signifie "commande > /dev/null 2>&1 || true" en Linux?
2>&1
signifie "rediriger STDERR
(2) vers STDOUT
(1)"
(STDERR
(Erreur standard) a un descripteur de fichier prédéfini égal à 2
et le descripteur de fichier de STDOUT
(sortie standard) est égal à 1)
>
- est la même chose que 1>
et signifie rediriger STDOUT
vers quelque chose
Ensuite, l'opération entière sera traduite comme suit:
commande > /dev/null 2>&1
- redirige les descripteurs de fichier STDOUT et STDERR vers le "trou noir" ou ignore essentiellement toutes les sorties de commande
("trou noir" ou /dev/null
est un périphérique spécial qui accepte une entrée et l'ignore en interne)
Concernant || true
- Si commande
renvoie un code de sortie non nul (généralement indiquant un type d'erreur/échec), alors true
force le code de sortie à 0 (zéro) indiquant le succès.
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.