"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 connaître 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 connaître la signification spécifique de *2>&1 || true*
TL;DR: >/dev/null 2>&1 || true
permet de neutraliser efficacement la commande, en jetant tout (erreur ou normale) la sortie 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 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 en cours, ce qui signifie aujourd'hui essentiellement 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 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 est écrit dedans.
2>&1
redirige ensuite le descripteur de fichier 2 (2>
) vers le descripteur de fichier 1 auquel il est actuellement lié (&1
).
Un raccourci pour lorsque vous voulez rediriger à la fois stdout
et stderr
vers le même endroit est d'utiliser &>
comme dans &> /dev/null
. Cela n'est cependant pas supporté dans tous les shells.
En spécifiant donc > /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 elle-même redirigée vers /dev/null). Cela a pour effet de neutraliser la commande en jetant toute sa sortie envoyée à stdout ou 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 ceci 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 simple texte à travers le terminal), cela fonctionne.
Le ||
signifie par contre que si le programme retourne un statut 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 pas confondre ceci avec le tuyau ordinaire, qui utilise un seul |
et relie la sortie de gauche à l'entrée de droite. L'opposé de ||
est &&
qui exécute le côté de droite uniquement si le côté gauche a retourné 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 quelle que soit le statut 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 succès. 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 échec (un 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é avec succès d'ici la fin de l'exécution de cet ensemble de commandes. Ainsi, vous savez que le code de statut actuel (disponible dans $?
) indiquera toujours une exécution réussie.
Que signifie "command > /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)
>
- c'est la même chose que 1>
et signifie rediriger STDOUT
vers quelque chose
Alors toute l'opération 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 command
("trou noir" ou /dev/null
est un dispositif spécial qui accepte l'entrée et l'ignore internalement)
En ce qui concerne || true
- Si command
renvoie un code de sortie non nul (zéro) (ce qui indique généralement 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.