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

0

In einem Bash-Skript möchte ich einen Befehl ausführen, während der stderr sowohl an eine Datei als auch an das Terminal weitergeleitet wird. Ich möchte jedoch, dass stderr im Dateideskriptor '2' bleibt, damit ich ihn von einem externen Prozess aus 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 Wechseln 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 soll, wird stdout und stdout zu stderr, was für mich nicht gut ist. Ich habe versucht, sie wieder so auszutauschen:

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

aber das geht nicht.

Eddy
quelle

Antworten:

1

Ich habe am Ende herausgefunden, wie es geht, nachdem ich den Rat auf dieser Seite befolgt habe . Ich muss stderr umleiten, um teedann die Ausgabe von teezurück zu stderr umzuleiten .

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