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.
echo "Installing nano ......"; yum install nano &> /dev/null
Réponses:
Utilisez ceci.
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:
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>&-
: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:>&2
redirige stdout vers le descripteur 2 (stderr),>&3
redirige 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: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:
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.Consultez le manuel bash sur les redirections pour plus de détails, les options et la syntaxe.
la source
/dev/null
ou/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
.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.
la source
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
stdout
une commande en faisantet désactivez
stderr
en faisant:Si vous voulez les deux , vous pouvez faire:
Le
2>&1
dit envoie stderr au même endroit que stdout.la source
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:
Redirigez la sortie standard vers
/dev/null
, mais pas vers l'erreur standard. Cela affichera les erreurs survenues lors de l'installation, par exemple siyum
vous ne trouvez pas de package.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
.la source
>/dev/null 2>&1
mettra en sourdinestdout
etstderr
la source
Vous ne devez pas utiliser bash dans ce cas pour vous débarrasser de la sortie. Yum a une option
-q
qui supprime la sortie.Vous voudrez certainement aussi utiliser
-y
Pour voir toutes les options de yum, utilisez
man yum
.la source
Tapez ".SILENT:" au début de votre script sans les deux points.
la source