Ich muss stdout und stderr in Protokolldateien protokollieren, aber nur die Fehlermeldungen auf dem Bildschirm anzeigen. Ich kann das machen mit:
cp -rpv a/* b 1> copyLog.txt 2> >(tee copyError.txt >&2)
Was ich irgendwo im Web gefunden habe.
Ich möchte nur wissen, wie dieses >(tee copyError.txt >&2)
Ding heißt? Ich kann nicht dafür googeln, da Google Zeichen wie spitze Klammern und Klammern ignoriert.
Antworten:
Von
man bash
:Sie können Manpages durchsuchen, indem Sie
/
Ihre Suchzeichenfolge drücken und dann eingeben. Dies ist eine gute Möglichkeit, solche Informationen zu finden. Es setzt natürlich voraus, dass Sie wissen, auf welcher Manpage Sie suchen müssen :)Sie müssen das
(
allerdings zitieren , da es bei der Suche eine besondere Bedeutung hat. Geben Sie Folgendes ein, um den entsprechenden Abschnitt in der Bash-Manpage zu finden/>\(
.quelle
>(tee copyError.txt >&2)
ist eigentlich ein paar verschiedene Funktionen:>(...)
wird als "Prozesssubstitution" bezeichnet. Es wird eine Named-Pipe- Datei erstellt/dev/fd
und durch Schreiben in diese Datei wird der Prozess in Klammern eingegeben.>
: Im Allgemeinen wird dies als "Ausgabeumleitung" bezeichnet und ermöglicht es Ihnen, Standardausgaben (>
oder1>
) oder Standardfehler (2>
) an eine Datei oder einen Prozess zu senden .>&2
ist die Ausgabeumleitung, aber in diesem Fall wird die Ausgabe vontee
an den Standardfehler gesendet (das&2
ist, was ist,&1
ist die Standardausgabe)Ohne
>
wird in Klammern (()
) eine Unterschale gestartet. Das Ausführen von Befehlen in Klammern erzeugt eine weitere Shell, die nur so lange vorhanden ist, wie diese Befehle ausgeführt werden. Sie können sehen, wie dies funktioniert, wenn Sie eine Variable in der Subshell deklarieren:Wie Sie sehen können, unterscheidet sich das
$foo
in der Subshell definierte von dem in der übergeordneten Shell definierten.quelle
>(...)
ist keine Umleitung.>(...)
wird zu einem Dateinamen erweitert. Wenn Sie die Ausgabe dorthin umleiten möchten , benötigen Sie diese, werden> >(...)
jedoch>(...)
allgemeiner verwendet, wenn Umleitungen nicht verwendet werden können. Der Befehl des OP kann mit herkömmlichen Pipes ausgeführt werden, da dort keine Prozessersetzung erforderlich ist.cmd 2>&1 > output | tee err >&2
>
dass()
dies eine Ausgabeumleitung und eine Unterschale bezeichnen kann, aber>(...)
tatsächlich ein einzelnes, einheitliches Merkmal ist, das nicht aus>
und besteht()
.