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.
echo "Installing nano ......"; yum install nano &> /dev/null
Antworten:
Benutze das.
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:
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>&-
: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:>&2
leitet stdout zu Deskriptor 2 (stderr) um,>&3
leitet 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: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:
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.Weitere Informationen, Optionen und Syntax finden Sie im Bash-Handbuch zu Weiterleitungen .
quelle
/dev/null
oder/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
.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.
quelle
Ein Prozess muss normalerweise zwei Ausgänge überprüfen: stdout (Standardausgang) und stderr (Standardfehler).
Normalerweise gehen Informationsnachrichten an
sdout
und Fehler und Warnungen gehen anstderr
.Sie können
stdout
einen Befehl deaktivieren, indem Sie Folgendes tunund ausschalten,
stderr
indem Sie Folgendes tun:Wenn Sie beide deaktivieren möchten , können Sie Folgendes tun:
Das
2>&1
sagt send stderr an den gleichen Ort wie stdout.quelle
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:
Leiten Sie die Standardausgabe um
/dev/null
, aber nicht den Standardfehler. Dies zeigt die Fehler an, die während der Installation auftreten, z. B. wennyum
kein Paket gefunden werden kann.Während dieser Code nichts im Terminal anzeigt, werden sowohl Standardfehler als auch Standardausgabe umgeleitet und somit auf null gesetzt
/dev/null
.quelle
>/dev/null 2>&1
wird beide stumm schaltenstdout
undstderr
quelle
In diesem Fall sollten Sie bash nicht verwenden, um die Ausgabe zu entfernen. Yum hat eine Option,
-q
die die Ausgabe unterdrückt.Sie werden sicherlich auch verwenden wollen
-y
Verwenden Sie, um alle Optionen für yum anzuzeigen
man yum
.quelle
Geben Sie am Anfang Ihres Skripts ".SILENT:" ohne Doppelpunkte ein.
quelle