So verbergen Sie die Befehlsausgabe in Bash

99

Ich möchte meine Bash-Skripte für den Endbenutzer eleganter gestalten. Wie verstecke ich die Ausgabe, wenn Bash Befehle ausführt?

Zum Beispiel, wenn Bash ausgeführt wird

yum install nano

Folgendes wird dem Benutzer angezeigt, der den Bash ausgeführt hat:

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!

Jetzt möchte ich dies vor dem Benutzer verbergen und stattdessen zeigen:

    Installing nano ......

Wie kann ich diese Aufgabe erfüllen? Ich werde auf jeden Fall helfen, das Skript benutzerfreundlicher zu gestalten. Wenn ein Fehler auftritt, sollte er dem Benutzer angezeigt werden.

Ich möchte wissen, wie dieselbe Nachricht angezeigt wird, während eine Reihe von Befehlen ausgeführt wird.

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

Antworten:

244

Benutze das.

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

Erläuterung

Um die Ausgabe von Befehlen zu eliminieren, haben Sie zwei Möglichkeiten:

  • Schließen Sie die Ausgabedeskriptordatei, damit keine weiteren Eingaben akzeptiert werden. Das sieht so aus:

    your_command "Is anybody listening?" >&-

    Normalerweise geht die Ausgabe entweder an den Dateideskriptor 1 (stdout) oder 2 (stderr). Wenn Sie einen Dateideskriptor schließen, müssen Sie dies für jeden nummerierten Deskriptor tun, da &>(unten) eine spezielle BASH-Syntax ist, die nicht kompatibel ist mit >&-:

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

    Beachten Sie die Reihenfolge: >&- Schließt stdout , was Sie tun möchten; &>-Leitet stdout und stderr in eine Datei mit dem Namen -(Bindestrich) um. Dies ist nicht das, was Sie tun möchten. Zuerst sieht es genauso aus, aber letzteres erstellt eine Streudatei in Ihrem Arbeitsverzeichnis. Es ist leicht zu merken: >&2leitet stdout zu Deskriptor 2 (stderr) um, >&3leitet stdout zu Deskriptor 3 um und >&-leitet stdout zu einer Sackgasse um (dh es schließt stdout).

    Beachten Sie auch, dass einige Befehle einen geschlossenen Dateideskriptor möglicherweise nicht besonders gut verarbeiten ("Schreibfehler: Ungültiger Dateideskriptor"), weshalb die bessere Lösung möglicherweise darin besteht, ...

  • Ausgabe umleiten an/dev/null , die alle Ausgaben akzeptiert und nichts damit macht. Es sieht aus wie das:

    your_command "Hello?" > /dev/null

    Für die Umleitung der Ausgabe in eine Datei können Sie sowohl stdout als auch stderr sehr präzise an dieselbe Stelle leiten, jedoch nur in bash:

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

Um dasselbe für mehrere Befehle gleichzeitig zu tun, umgeben Sie das Ganze in geschweiften Klammern. Bash behandelt dies als eine Gruppe von Befehlen , die die Ausgabedateideskriptoren zusammenfassen, sodass Sie alle auf einmal umleiten können. Wenn Sie stattdessen mit Subshells mit ( command1; command2; )Syntax vertraut sind , verhalten sich die geschweiften Klammern fast genauso, mit der Ausnahme, dass die geschweiften Klammern keine Unterschale erstellen und Sie somit Variablen festlegen können, sofern Sie sie nicht in eine Pipe einbinden.

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

Weitere Informationen, Optionen und Syntax finden Sie im Bash-Handbuch zu Weiterleitungen .

Jeff Bowman
quelle
Hallo, ich weiß, dass es eine alte Frage ist, aber kann das auch unter bestimmten Bedingungen getan werden? Wie möchte ich die Ausgabe unter bestimmten Bedingungen ausblenden? Ich weiß, dass ich denselben Teil unter if-else replizieren kann, aber gibt es einen besseren Weg, dies zu tun?
Usama Zafar
@UsamaZafar Ich würde das tun, indem ich eine Variable ( "Shell-Parameter" ) setze, die Sie entweder /dev/nulloder /dev/stdout(oder /path/to/a/logfile) bedingt früher im Skript festgelegt haben, und dann mit &> $output_dest(oder wie auch immer Sie es nennen) zu diesem Ziel umleiten . Wenn Sie in diesem Fall stdout und stderr nicht kombinieren möchten, können Sie sie wie folgt separat umleiten > $output_dest 2> $errors_dest.
Jeff Bowman
34

Sie können stdout nach / dev / null umleiten.

yum install nano > /dev/null

Oder Sie können sowohl stdout als auch stderr umleiten.

yum install nano &> /dev/null.

Aber wenn das Programm eine leise Option hat, ist das noch besser.

ktm5124
quelle
23

Ein Prozess muss normalerweise zwei Ausgänge überprüfen: stdout (Standardausgang) und stderr (Standardfehler).

Normalerweise gehen Informationsnachrichten an sdoutund Fehler und Warnungen gehen an stderr.

Sie können stdouteinen Befehl deaktivieren, indem Sie Folgendes tun

MyCommand >/dev/null

und ausschalten, stderrindem Sie Folgendes tun:

MyCommand 2>/dev/null

Wenn Sie beide deaktivieren möchten , können Sie Folgendes tun:

MyCommand 2>&1 >/dev/null

Das 2>&1sagt send stderr an den gleichen Ort wie stdout.

LeOn - Han Li
quelle
8

Sie können die Ausgabe an umleiten /dev/null. Weitere Informationen zu / dev / null finden Sie unter diesem Link .

Sie können die Ausgabe eines Befehls folgendermaßen ausblenden:

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

Leiten Sie die Standardausgabe um /dev/null, aber nicht den Standardfehler. Dies zeigt die Fehler an, die während der Installation auftreten, z. B. wenn yumkein Paket gefunden werden kann.

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

Während dieser Code nichts im Terminal anzeigt, werden sowohl Standardfehler als auch Standardausgabe umgeleitet und somit auf null gesetzt /dev/null.

Giuseppe Pes
quelle
1
Großartiger Anteil ... Alter, können Sie mir zeigen, wie ich dieselbe Nachricht nur einmal für eine Reihe von Befehlen
ausgeben kann
5

>/dev/null 2>&1wird beide stumm schalten stdoutundstderr

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

In diesem Fall sollten Sie bash nicht verwenden, um die Ausgabe zu entfernen. Yum hat eine Option, -qdie die Ausgabe unterdrückt.

Sie werden sicherlich auch verwenden wollen -y

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

Verwenden Sie, um alle Optionen für yum anzuzeigen man yum.

kkeller
quelle
Danke, ich nahm an, dass yum seit apt-get used -qq auch eine hatte, um sie zu unterdrücken. Dies war hilfreich für das, was ich tue.
Hyperion
0
.SILENT:

Geben Sie am Anfang Ihres Skripts ".SILENT:" ohne Doppelpunkte ein.

Arif
quelle