389 votes

Comment supprimer toutes les sorties d'une commande en utilisant Bash ?

J'ai un script Bash qui exécute un programme avec des paramètres. Ce programme sort un certain statut (faire ceci, faire cela...). Il n'y a pas d'option pour que ce programme soit silencieux. Comment puis-je empêcher le script d'afficher quoi que ce soit ?

Je cherche quelque chose comme "Windows". "echo off" .

656voto

andynormancx Points 6026

Ce qui suit envoie la sortie standard vers le périphérique null (bit bucket).

scriptname >/dev/null

Et si vous souhaitez également que les messages d'erreur soient envoyés à cet endroit, utilisez l'une des options suivantes (la première peut ne pas fonctionner dans tous les shells) :

scriptname &>/dev/null
scriptname >/dev/null 2>&1
scriptname >/dev/null 2>/dev/null

Et, si vous voulez enregistrer les messages, mais pas les voir, remplacez /dev/null avec un fichier réel, tel que :

scriptname &>scriptname.out

Pour être complet, sous Windows cmd.exe (où "nul" est l'équivalent de "/dev/null"), c'est :

scriptname >nul 2>nul

14 votes

Notez que '&>' est propre à bash (et peut-être aux shells C) ; les shells Korn et Bourne requièrent 2> /dev/null ou 2>&1 (pour envoyer stderr au même endroit que stdout). L'interpréteur de commandes Korn semble interpréter '&>' comme "exécuter les opérations jusqu'à & en arrière-plan, puis effectuer la redirection des entrées/sorties sur une commande vide".

5 votes

Notez que certaines commandes écrivent directement sur le périphérique terminal plutôt que sur la sortie standard/erreur. Pour tester, mettez echo foo > $(tty) dans un script et exécutez ./test.sh &> /dev/null - La sortie est toujours imprimée sur le terminal. Bien sûr, ce n'est pas un problème si vous écrivez un script qui n'utilise pas de telles commandes.

2 votes

@l0b0, y a-t-il un moyen de rendre le tty de script (ou de tout autre programme) différent afin que toute la sortie soit redirigée indépendamment de votre exemple ? Je sais que screen et script peuvent faire quelque chose comme ça mais les deux sont pointilleux et varient de *nix à *nix.

57voto

Diego Sevilla Points 17274

Quelque chose comme

script > /dev/null 2>&1

Cela empêchera la sortie standard y la sortie d'erreur, en les redirigeant tous les deux vers /dev/null .

5 votes

Egalement réalisable avec juste &> si vous voulez économiser de la frappe ;)

1 votes

Même si je l'ajoute à ma commande gs (GhostScript), le message **** s'affiche toujours : Le fichier a un marqueur %%EOF corrompu, ou des déchets après %%EOF. Un conseil ?

0 votes

Cela n'exécute pas le processus sur les systèmes unix, j'ai du faire 2>/dev/null

20voto

semente Points 1274

Une alternative qui peut convenir dans certaines situations est d'assigner le résultat d'une commande à une variable :

$ DUMMY=$( grep root /etc/passwd 2>&1 )
$ echo $?
0
$ DUMMY=$( grep r00t /etc/passwd 2>&1 )
$ echo $?
1

Puisque Bash et les autres interprètes de ligne de commande POSIX ne considèrent pas les affectations de variables comme une commande, le code de retour de la présente commande est respecté.

Note : l'affectation avec le typeset o declare est considéré comme une commande, donc le code de retour évalué dans ce cas est l'assignation elle-même et non la commande exécutée dans le sous-shell :

$ declare DUMMY=$( grep r00t /etc/passwd 2>&1 )
$ echo $?
0

18voto

V0idSt4r Points 161

Essayez

: $(yourcommand)

: est l'abréviation de "ne rien faire".

$() est juste votre commande.

4 votes

Très intéressant mais il y a une limitation : le code d'état retourné est toujours 0 (succès). Voyons un exemple en utilisant la commande false qui renvoie toujours 1 (échec). Par exemple ( echo foo | tee file ; false ) && echo bar affiche foo . En utilisant votre truc pour supprimer la sortie : ( : $(echo foo | tee file ; false) ) && echo bar . Mais il affiche bar ce qui signifie que le code d'état de retour est 0 (ce n'est pas le code d'état renvoyé par false ). Veuillez mettre à jour votre réponse en tenant compte de cette limitation. Salutations

3 votes

@olibre, qu'en est-il DUMMY=$(yourcommand) ? Il n'a pas les limitations que vous avez mentionnées :)

3 votes

@semente Perfect : La commande DUMMY=$( echo foo | tee file ; false ) && echo bar n'affiche rien. Et la commande DUMMY=$( echo foo | tee file ; true ) && echo bar affiche bar . Faites-moi savoir si vous fournissez une réponse pour l'upvote ;-) Salutations

8voto

Comme poste d'andynormancx utilisez ceci (si vous travaillez dans un environnement Unix) :

scriptname > /dev/null

Ou vous pouvez utiliser ceci (si vous travaillez dans un environnement Windows) :

scriptname > nul

1 votes

Vous pouvez en fait faire mieux que cela dans le shell Windows. Si vous utilisez à la place "scriptname > nul", vous n'aurez même pas de fichier à supprimer, car "nul" est l'équivalent de /dev/null dans Windows.

1 votes

@andynormancx : C'est ce que je déteste dans la disposition du système de fichiers de Windows. Il "réserve" des noms de fichiers comme NUL, COM1, LPT1, CON, etc., quel que soit le répertoire dans lequel vous vous trouvez (même si vous êtes dans un système de fichiers qui peut avoir ces noms de fichiers, comme dans les partages réseau).

0 votes

Je ne pense pas avoir utilisé NUL depuis DOS 5.x, j'ai eu un flash de souvenir en voyant cette réponse ;)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X