In Unix-ähnlichen Systemen gibt es zwei Ausgabepfade, die, wenn sie nicht geändert werden, die Ausgabe an Ihren Bildschirm senden. Standardfehler (oder stderr) ist derjenige, der die meisten Fehler und Fehlerbedingungen erfasst.
Um die Meldung "Berechtigung verweigert" in "stderr" an denselben Ausgabestream wie "reguläre Ausgabe" zu übergeben, müssen Sie beide kombinieren. In Ihrem Beispiel grep -v
kombinieren Sie stdout (Standardausgabe) und stderr mit der angezeigten arkanen Syntax, damit Sie ordnungsgemäß damit arbeiten können.
Aus dem GNU Bash-Handbuch, Abschnitt 3.2.2 Pipelines :
Wenn ' |&
' verwendet wird, wird der Standardfehler von Befehl1 zusätzlich zu seiner Standardausgabe über die Pipe mit dem Standardeingang von Befehl2 verbunden . es ist eine Abkürzung für 2>&1 |
. Diese implizite Umleitung des Standardfehlers zur Standardausgabe erfolgt nach allen vom Befehl angegebenen Umleitungen.
Außerdem, wie geirha betont, möchten Sie, wenn Sie nur die stderr-Ausgabe entfernen möchten, so etwas wie tun
find -name 'myfile.*' 2> /dev/null
oder vielleicht
find -name 'myfile.*' 2> /tmp/errorlog
Beachten Sie, dass Sie bei Befehlsfolgen, z. B. der find
Übergabe der Ausgabe an xargs
, die gesamte Befehlspipeline in Klammern setzen müssen, um die Ausgabe aller Befehlskomponenten zu erfassen. Z.B,
(find | egrep ^[RS].[0-9]+/.svg] | xargs head -1 ) 2> /dev/null
Wenn Sie die Klammern weggelassen und dies stattdessen getan haben -
find | egrep ^[RS].[0-9]+/.svg] | xargs head -1 2> /dev/null
Es werden weiterhin Fehler mit der Berechtigung "verweigert" in "find" oder "egrep" angezeigt, "stderr" wird jedoch für "xargs" umgeleitet.
Wie Sie gesehen haben, werden Sie den stderr wahrscheinlich erst dann wegwerfen, wenn Sie seinen Inhalt während eines Testlaufs angesehen haben.
Beachten Sie, dass bei GNU find
und soweit ich das beurteilen kann, bei POSIX-kompatiblen find
die -print
Option implizit ist. Sie können es trotzdem explizit angeben, wenn Sie möchten.
2>&1 |
kann anstelle von verwendet werden|&
(dh man kann stderr explizit an stdout umleiten und dann an den nächsten Befehl in der Pipeline weiterleiten).2> >( grep filter )
ist auch praktischFehlermeldungen werden nach stderr geschrieben , nicht nach stdout , sondern
|
nur nach stdout .Du willst wahrscheinlich
|&
, welche Rohre stderr als auch stdout .quelle
Wenn Sie die Fehlermeldungen ignorieren möchten, leiten Sie stderr einfach nach / dev / null um.
Lesen Sie auch http://mywiki.wooledge.org/UsingFind .
quelle