Comment supprimer toutes les sorties d'une commande à l'aide de Bash?

296

J'ai un script Bash qui exécute un programme avec des paramètres. Ce programme génère un certain statut (faire ceci, faire cela ...). Il n'y a aucune 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 "l'écho désactivé" de Windows .

6 octets
la source

Réponses:

510

Ce qui suit envoie une sortie standard au périphérique nul (compartiment de bits).

scriptname >/dev/null

Et si vous souhaitez également que des messages d'erreur y soient envoyés, utilisez l'un des (le premier 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 souhaitez enregistrer les messages, mais ne les voyez pas, remplacez-les /dev/nullpar 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
andynormancx
la source
8
Notez que '&>' est propre à bash (et peut-être aux shells C); Les shells Korn et Bourne nécessitent 2> / dev / null ou 2> & 1 (pour envoyer stderr au même endroit que stdout). Le shell Korn semble interpréter '&>' comme "exécuter le truc jusqu'à & en arrière-plan, puis faire la redirection d'E / S sur une commande vide".
Jonathan Leffler
2
Notez que certaines commandes écrivent directement sur le terminal plutôt que sur la sortie / erreur standard. Pour tester, mettez echo foo > $(tty)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.
l0b0
1
@ l0b0, existe-t-il un moyen de rendre le tty du script (ou de tout autre programme) différent afin que toutes les sorties soient redirigées quel que soit votre exemple? Je sais que l'écran et le script peuvent faire quelque chose comme ça, mais les deux sont capricieux et varient de * nix à * nix.
Brent
@yang /dev/nullexiste dans Cygwin, vous n'avez pas besoin de l'utiliser nul.
dimo414
47

Quelque chose comme

script > /dev/null 2>&1

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

Diego Sevilla
la source
5
Également atteint avec juste &> si vous voulez économiser de la frappe;)
andynormancx
1
Même si j'ajoute ceci à ma commande gs (GhostScript), il affiche toujours **** Avertissement: le fichier a un marqueur %% EOF corrompu, ou des ordures après %% EOF. Aucun conseil?
ZurabWeb
Cela ne fonctionne pas sur les systèmes Unix, je devais le faire2>/dev/null
alper
13

Essayer

: $(yourcommand)

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

$() est juste votre commande.

V0idSt4r
la source
3
Très intéressant mais il y a une limitation: le code d'état retourné est toujours 0(succès). Voyons un exemple utilisant une commande falsequi retourne toujours 1(échec). Par exemple, ( echo foo | tee file ; false ) && echo baraffiche foo. En utilisant votre truc pour supprimer la sortie: ( : $(echo foo | tee file ; false) ) && echo bar. Mais il affiche barce qui signifie que le code d'état de retour est 0(ce n'est pas le code d'état renvoyé de false). Veuillez mettre à jour votre réponse en fournissant cette limitation. Vive
olibre
2
@olibre, qu'en est-il DUMMY=$(yourcommand)? Il n'a pas la limitation que vous avez mentionnée. :)
semente
3
@semente Perfect: La commande DUMMY=$( echo foo | tee file ; false ) && echo barn'affiche rien. Et la commande DUMMY=$( echo foo | tee file ; true ) && echo bars'affiche bar. Faites-moi savoir si vous fournissez une réponse pour le voter ;-) Cheers
olibre
9

Une alternative qui peut convenir dans certaines situations consiste à affecter 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

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

Remarque: l' affectation avec le mot clé typesetor declareest considérée comme une commande, donc le code de retour évalué dans le cas est l'affectation elle-même et non la commande exécutée dans le sous-shell:

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

Comme la publication 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
Lucas Gabriel Sánchez
la source
1
Vous pouvez réellement faire mieux que cela dans le shell Windows. Si à la place vous utilisez "scriptname> nul", vous n'aurez même pas de fichier à supprimer, car "nul" est l'équivalent Windows de / dev / null.
andynormancx
1
@andynormancx: C'est ce que je déteste à propos de la disposition du système de fichiers Windows. Il "réserve" les 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).
dreamlax
Je ne pense pas avoir utilisé NUL depuis DOS 5.x, j'ai eu un flash de souvenir soudain quand j'ai vu cette réponse;)
andynormancx
Dans le cas où vous avez utilisé > nulsur Windows avec cygwin ou git bash et maintenant vous êtes coincé avec un nulfichier qui ne peut pas être supprimé, essayez cette réponse , cela a fonctionné comme un charme.
Daemon Painter
4

Jetez un œil à cet exemple du projet de documentation Linux :

3.6 Exemple: fichier stderr et stdout 2

Cela placera chaque sortie d'un programme dans un fichier. Cela convient parfois aux entrées cron, si vous voulez qu'une commande passe dans un silence absolu.

     rm -f $(find / -name core) &> /dev/null 

Cela dit, vous pouvez utiliser cette redirection simple:

/path/to/command &>/dev/null
ivanleoncz
la source
1

Dans votre script, vous pouvez ajouter ce qui suit aux lignes dont vous savez qu'elles donneront une sortie:

some_code 2>>/dev/null

Sinon, vous pouvez également essayer

some_code >>/dev/null
Rohan Dsouza
la source
1
jamais vu >> à / dev / null .. par curiosité .. Pourquoi faites-vous cela?
Florian Berndl
Est-ce qu'il supprime toutes les sorties?
Peter Mortensen
Pourquoi le double ">" ( >>)?
Peter Mortensen