it-swarm.com.de

Wie kann ich mit Bash Standardfehler in einen anderen Prozess leiten?

Es ist allgemein bekannt, wie die Standardausgabe eines Prozesses in eine andere Standardeingabe des Prozesses umgeleitet wird:

proc1 | proc2

Was aber, wenn ich den Standardfehler von proc1 an proc2 senden und die Standardausgabe an ihrem aktuellen Speicherort belassen möchte? Sie würden denken, dass bash einen Befehl wie folgt haben würde:

proc1 2| proc2

Aber leider nicht. Gibt es eine Möglichkeit, dies zu tun?

108
paxdiablo

Es gibt auch Prozessersetzung . Was macht einen Prozess für eine Datei ersetzen.
Sie können stderr wie folgt an eine Datei senden:

process1 2> file

Sie können die Datei jedoch wie folgt durch einen Prozess ersetzen:

process1 2> >(process2)

Hier ist ein konkretes Beispiel, das stderr an den Bildschirm sendet und an eine Protokolldatei anfügt

sh myscript 2> >(tee -a errlog)
137
Scot

Sie können den folgenden Trick verwenden, um swap stdout und stderr. Dann nutzen Sie einfach die reguläre Pipe-Funktionalität.

( proc1 3>&1 1>&2- 2>&3- ) | proc2

Vorausgesetzt, stdout und stderr wiesen beide beim Start auf die gleiche Stelle, so erhalten Sie das, was Sie brauchen.

Was das x>y-Bit tut, ist das Ändern des Dateihandles x, so dass es jetzt seine Informationen dahin sendet, wo der Dateihandle y aktuell zeigt. Für unseren speziellen Fall:

  • 3>&1 erstellt einen new handle 3, der an den current handle 1 (original stdout) ausgegeben wird, um ihn irgendwo für den letzten Aufzählungspunkt unten zu speichern.
  • 1>&2 ändert das Handle 1 (stdout) zur Ausgabe an das current handle 2 (ursprüngliches stderr).
  • 2>&3- ändert das Handle 2 (stderr) für die Ausgabe an das current - Handle 3 (ursprüngliches stdout) und schließt dann das Handle 3 (über den - am Ende).

Es ist tatsächlich der Swap-Befehl, den Sie in Sortieralgorithmen sehen:

temp   = value1;
value1 = value2;
value2 = temp;
85
paxdiablo

Bash 4 hat diese Funktion:

Wenn `| & verwendet wird, wird der Standardfehler von command1 über die Pipe mit der Standardeingabe von command2 verbunden. es ist die Abkürzung für 2> & 1 |. Diese implizite Umleitung des Standardfehlers wird nach den vom Befehl angegebenen Umleitungen durchgeführt.

zsh hat auch diese Funktion.

-

Bei anderen/älteren Shells geben Sie dies explizit als ein

Erstbefehl 2> & 1 | OtherCommand

63

Tauschen ist großartig, da es das Problem löst. Für den Fall, dass Sie nicht einmal das Original stdout benötigen, können Sie dies folgendermaßen tun:

proc1 2>&1 1>/dev/null | proc2

Die Reihenfolge ist von entscheidender Bedeutung. du würdest nicht wollen:

proc1 >/dev/null 2>&1 | proc1

Da dies alles zu /dev/null umleiten wird!

25
kccqzy

Nichts davon hat wirklich gut funktioniert. Der beste Weg, was ich wollte, ist:

(command < input > output) 2>&1 | less

Dies funktioniert nur in Fällen, in denen command keine Tastatureingaben benötigt. z.B:

(gzip -d < file.gz > file) 2>&1 | less

würde gzip-Fehler in weniger setzen

0
sbingner