web-dev-qa-db-fra.com

Comment masquer le résultat de la commande dans bash

Je veux que mes scripts bash soient plus élégants pour l'utilisateur final. Comment puis-je masquer la sortie lorsque bash exécute des commandes? Par exemple, lorsque bash s'exécute

yum install nano

Ce qui suit sera montré à l'utilisateur qui a exécuté le bash

Loaded plugins: fastestmirror
base                                                     | 3.7 kB     00:00
base/primary_db                                          | 4.4 MB     00:03
extras                                                   | 3.4 kB     00:00
extras/primary_db                                        |  18 kB     00:00
updates                                                  | 3.4 kB     00:00
updates/primary_db                                       | 3.8 MB     00:02
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package nano.x86_64 0:2.0.9-7.el6 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================
 Package         Arch              Version                Repository       Size
================================================================================
Installing:
 nano            x86_64            2.0.9-7.el6            base            436 k

Transaction Summary
================================================================================
Install       1 Package(s)

Total download size: 436 k
Installed size: 1.5 M
Downloading Packages:
nano-2.0.9-7.el6.x86_64.rpm                              | 436 kB     00:00
warning: rpmts_HdrFromFdno: Header V3 RSA/SHA256 Signature, key ID c105b9de: NOKEY
Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
Importing GPG key 0xC105B9DE:
 Userid : CentOS-6 Key (CentOS 6 Official Signing Key) <[email protected]>
 Package: centos-release-6-4.el6.centos.10.x86_64 (@anaconda-CentOS-201303020151.x86_64/6.4)
 From   : /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing : nano-2.0.9-7.el6.x86_64                                      1/1
  Verifying  : nano-2.0.9-7.el6.x86_64                                      1/1

Installed:
  nano.x86_64 0:2.0.9-7.el6

Complete!

Maintenant, je veux cacher cela de l'utilisateur et montrer plutôt

Installing nano ......

Comment puis-je accomplir cette tâche? J'aiderai certainement à rendre le script plus convivial. Dans le cas où une erreur surviendrait, elle devrait être montrée à l'utilisateur.

Edit je voudrais savoir comment afficher le même message pendant l'exécution d'un ensemble de commandes

79
user2650277

Utilisez ceci.

{
  /your/first/command
  /your/second/command
} &> /dev/null

Explication

Pour éliminer la sortie des commandes, vous avez deux options:

  • Fermez le fichier de descripteur de sortie, ce qui l’empêche d’accepter plus d’entrée. Cela ressemble à ceci:

    your_command "Is anybody listening?" >&-
    

    Habituellement, la sortie va au descripteur de fichier 1 (stdout) ou 2 (stderr). Si vous fermez un descripteur de fichier, vous devrez le faire pour chaque descripteur numéroté, car &> (ci-dessous) est une syntaxe BASH spéciale incompatible avec >&-:

    /your/first/command >&- 2>&-
    

    Veillez à noter l'ordre: >&-ferme stdout , c'est ce que vous voulez faire; &>- redirige stdout et stderr vers un fichier nommé - (trait d'union), ce qui n'est pas ce que vous voulez faire. Au début, ça va ressembler, mais ce dernier crée un fichier parasite dans votre répertoire de travail. Il est facile à retenir: >&2 redirige stdout vers le descripteur 2 (stderr), >&3 redirige stdout vers le descripteur 3 et >&- redirige stdout vers une impasse (c.-à-d. Qu'il ferme stdout).

    Notez également que certaines commandes peuvent ne pas gérer particulièrement bien un descripteur de fichier fermé ("erreur d'écriture: descripteur de fichier incorrect"), c'est pourquoi la meilleure solution peut être de ...

  • Redirige la sortie vers /dev/null, qui accepte toutes les sorties et ne fait rien avec. Cela ressemble à ceci:

    your_command "Hello?" > /dev/null
    

    Pour la redirection de sortie vers un fichier, vous pouvez diriger très précisément stdout et stderr au même endroit, mais uniquement en bash:

    /your/first/command &> /dev/null
    

Enfin, pour faire la même chose pour plusieurs commandes à la fois, entourez le tout d’accolades. Bash traite cela comme n groupe de commandes , agrégeant les descripteurs de fichier de sortie afin que vous puissiez les rediriger en une seule fois. Si vous connaissez plutôt les sous-shell utilisant la syntaxe ( command1; command2; ), vous constaterez que les accolades se comportent presque exactement de la même manière, sauf que si vous ne les impliquez pas dans un tuyau, ils ne créeront pas de sous-shell et vous permettront ainsi. définir des variables à l'intérieur.

{
  /your/first/command
  /your/second/command
} &> /dev/null

Voir le manuel bash sur les redirections pour plus de détails, d'options et de syntaxe.

221
Jeff Bowman

Vous pouvez rediriger stdout vers/dev/null.

yum install nano > /dev/null

Ou vous pouvez rediriger à la fois stdout et stderr,

yum install nano &> /dev/null.

Mais si le programme a une option silencieuse, c'est encore mieux.

31
ktm5124

Un processus a normalement deux sorties à filtrer: stdout (sortie standard), et stderr (erreur standard).

Normalement, les messages d’information vont à sdout, et les erreurs et les alertes à stderr.

Vous pouvez désactiver stdout pour une commande en faisant

MyCommand >/dev/null

et éteignez stderr en faisant:

MyCommand 2>/dev/null

Si vous voulez les deux éteints, vous pouvez faire:

MyCommand 2>&1 >/dev/null

Le 2>&1 dit envoyer stderr au même endroit que stdout.

15
LeOn - Han Li

Vous pouvez rediriger la sortie vers /dev/null. Pour plus d'informations sur/dev/null, lisez ceci lien .

Vous pouvez masquer la sortie d'une commande de l'une des manières suivantes:

echo -n "Installing nano ......"; yum install nano > /dev/null; echo " done."; 

Redirige la sortie standard vers /dev/null, mais pas l'erreur standard. Cela montrera les erreurs survenant pendant l'installation, par exemple si yum ne peut pas trouver un paquet.

echo -n "Installing nano ......"; yum install nano &> /dev/null; echo " done.";

Bien que ce code n’affiche rien dans le terminal car l’erreur standard et la sortie standard sont redirigées et sont donc annulées en /dev/null.

6
Giuseppe Pes

>/dev/null 2>&1 coupera le son stdout et stderr

yum install nano >/dev/null 2>&1
4
Quanlong

Dans ce cas, vous ne devez pas utiliser bash pour vous débarrasser de la sortie. Yum a une option -q qui supprime la sortie.

Vous voudrez certainement aussi utiliser -y

echo "Installing nano..."
yum -y -q install nano

Pour voir toutes les options pour yum, utilisez man yum.

4
kkeller
.SILENT:

Tapez ".SILENT:" au début de votre script sans les deux points.

0
Arif