Leiten Sie stderr an Datei und Bildschirm, ohne stderr an stdout umzuleiten

504
Eddy

In einem Bash-Skript möchte ich einen Befehl ausführen, während der stderr an eine Datei und an das Terminal geleitet wird. Ich möchte jedoch, dass stderr auf dem Dateideskriptor '2' verbleibt, damit ich ihn von einem externen Prozess analysieren kann, der dieses Bash-Skript aufruft.

Alle Lösungen, die ich bisher gesehen habe, beinhalten das Austauschen von stdout mit stderr und das anschließende Abschlagen in eine andere Datei, zum Beispiel :

find /var/log 3>&1 1>&2 2>&3 | foo.file 

Wenn ich dieses Skript von einem anderen aufrufen möchte, geht der stderr zum stdout und stdout zum stderr, was für mich nicht gut ist. Ich habe versucht, sie wieder so zu tauschen:

find /var/log 3>&1 1>&2 2>&3 | foo.file 4>&1 1>&2 2>&4 

aber das geht nicht.

0

1 Antwort auf die Frage

1
Eddy

Ich habe am Ende herausgefunden, wie ich es tun kann, nachdem ich auf dieser Seite Ratschläge gegeben hatte . Ich muss stderr umleiten, um teedann die Ausgabe von teeback nach stderr umzuleiten .

find /var/log 2> >(tee foo.file >&2) 
Sollte funktionieren, aber ich würde erwarten, dass stdout und stderr von `find` manchmal im Terminal desynchronisieren. Dies liegt an "tee", Puffern usw. Wenn "find" stdout und stderr direkt auf dasselbe Gerät schreibt, tritt das Problem nie auf. Wenn die beiden Streams jedoch später zusammengeführt werden, ist dies möglich. Kamil Maciorowski vor 5 Jahren 0