Comment masquer la sortie de commande dans Bash

99

Je veux rendre mes scripts Bash plus élégants pour l'utilisateur final. Comment masquer la sortie lorsque Bash exécute des commandes?

Par exemple, lorsque Bash exécute

yum install nano

Ce qui suit apparaîtra à 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 à l'utilisateur et afficher à la place:

    Installing nano ......

Comment puis-je accomplir cette tâche? Je vais certainement aider à rendre le script plus convivial. En cas d'erreur, elle doit être montrée à l'utilisateur.

J'aimerais savoir comment afficher le même message lors de l'exécution d'un ensemble de commandes.

user2650277
la source
4
echo "Installing nano ......"; yum install nano &> /dev/null
user000001

Réponses:

246

Utilisez ceci.

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

Explication

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

  • Fermez le fichier 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>&-

    Attention à bien 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. Cela aura la même apparence au début, mais ce dernier crée un fichier errant dans votre répertoire de travail. C'est facile à retenir: >&2redirige stdout vers le descripteur 2 (stderr), >&3redirige stdout vers le descripteur 3 et >&-redirige stdout vers une impasse (c'est-à-dire qu'il ferme stdout).

    Attention également à ce que certaines commandes ne gèrent pas 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 à la fois stdout et stderr vers le même endroit de manière très concise, mais uniquement dans bash:

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

Enfin, pour faire de même pour un certain nombre de commandes à la fois, entourez le tout entre accolades. Bash traite cela comme un groupe de commandes , agrégeant les descripteurs de fichier de sortie afin que vous puissiez tous les rediriger en même temps. Si vous êtes plutôt familier avec les sous-shell utilisant la ( command1; command2; )syntaxe, vous constaterez que les accolades se comportent presque exactement de la même manière, sauf qu'à moins que vous ne les impliquiez dans un tube, les accolades ne créeront pas de sous-shell et vous permettront donc de définir des variables à l'intérieur.

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

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

Jeff Bowman
la source
Salut, je sais que c'est une vieille question mais peut-on faire la même chose sous condition? Comme je veux cacher la sortie sous certaines conditions? Je sais que je peux reproduire la même pièce sous if-else mais y a-t-il une meilleure façon de le faire?
usamazf
@UsamaZafar Je ferais cela en définissant une variable ( "paramètre shell" ), que vous définissez sur /dev/nullou /dev/stdout(ou /path/to/a/logfile) conditionnellement plus tôt dans le script, puis en redirigeant vers cette destination en utilisant &> $output_dest(ou quel que soit votre nom). Si vous ne souhaitez pas combiner stdout et stderr dans ce cas, vous pouvez les rediriger séparément comme > $output_dest 2> $errors_dest.
Jeff Bowman
35

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.

ktm5124
la source
23

Un processus a normalement deux sorties à l'écran: stdout (sortie standard) et stderr (erreur standard).

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

Vous pouvez désactiver stdoutune commande en faisant

MyCommand >/dev/null

et désactivez stderren faisant:

MyCommand 2>/dev/null

Si vous voulez les deux , vous pouvez faire:

MyCommand 2>&1 >/dev/null

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

LeOn - Han Li
la source
8

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

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

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

Redirigez la sortie standard vers /dev/null, mais pas vers l'erreur standard. Cela affichera les erreurs survenues lors de l'installation, par exemple si yumvous ne trouvez pas de package.

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 donc annulées vers /dev/null.

Giuseppe Pes
la source
1
Grande part .... mec pouvez-vous me montrer comment sortir le même message qu'une seule fois pour un ensemble de commandes
user2650277
5

>/dev/null 2>&1mettra en sourdine stdoutetstderr

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

Vous ne devez pas utiliser bash dans ce cas pour vous débarrasser de la sortie. Yum a une option -qqui supprime la sortie.

Vous voudrez certainement aussi utiliser -y

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

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

kkeller
la source
Merci, j'ai supposé que yum en avait un car apt-get utilisait également -qq pour supprimer. Cela a été utile pour ce que je fais.
Hyperion
0
.SILENT:

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

Arif
la source