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
{
/your/first/command
/your/second/command
} &> /dev/null
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.
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.
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.
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
.
>/dev/null 2>&1
coupera le son stdout
et stderr
yum install nano >/dev/null 2>&1
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
.
.SILENT:
Tapez ".SILENT:" au début de votre script sans les deux points.