Wie heißt die Shell-Funktion `> (tee copyError.txt> & 2)`?


11

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.



@terdon Ich denke, das OP hat erklärt, dass er StdOut und StdErr in Dateien protokollieren wollte, aber auch immer noch StdErr auf dem Bildschirm
anzeigen wollte

Antworten:


11

Von man bash:

   Process Substitution
       Process substitution is supported  on  systems  that  support
       named  pipes  (FIFOs)  or  the  /dev/fd method of naming open
       files.  It takes the form of <(list) or >(list).  The process
       list  is  run with its input or output connected to a FIFO or
       some file in /dev/fd.  The name of this file is passed as  an
       argument  to  the current command as the result of the expan
       sion.  If the >(list) form is used, writing to the file  will
       provide  input  for  list.   If the <(list) form is used, the
       file passed as an argument should be read to obtain the  out
       put of list.

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 />\(.


Ich mache viel Bash, also habe ich einen Mann bash> bashman.txt gemacht und es schreibgeschützt gemacht. Jetzt kann ich bashman.txt in ein anderes Fenster in meinem Texteditor laden (schreibgeschützt) und alle Funktionen des Editors zum Suchen, Kopieren und Einfügen verwenden.
Joe

8

>(tee copyError.txt >&2) ist eigentlich ein paar verschiedene Funktionen:

  • >(...)wird als "Prozesssubstitution" bezeichnet. Es wird eine Named-Pipe- Datei erstellt /dev/fdund durch Schreiben in diese Datei wird der Prozess in Klammern eingegeben.

  • >: Im Allgemeinen wird dies als "Ausgabeumleitung" bezeichnet und ermöglicht es Ihnen, Standardausgaben ( >oder 1>) oder Standardfehler ( 2>) an eine Datei oder einen Prozess zu senden . >&2ist die Ausgabeumleitung, aber in diesem Fall wird die Ausgabe von teean den Standardfehler gesendet (das &2ist, was ist, &1ist 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:

    $ foo='Tom';(foo='Dick'; echo "Sub: $foo"); echo "Orig: $foo"
    Sub: Dick
    Orig: Tom

    Wie Sie sehen können, unterscheidet sich das $fooin der Subshell definierte von dem in der übergeordneten Shell definierten.


4
Nein >(...)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.
Stéphane Chazelas

@StephaneChazelas Wäre schön, die Lösung zu sehen, die Sie im Sinn hatten
Dmitry Avtonomov

3
@chhh,cmd 2>&1 > output | tee err >&2
Stéphane Chazelas

@StephaneChazelas danke!
Dmitry Avtonomov

Die erste Hälfte dieser Antwort ist falsch oder zumindest sehr irreführend. Es ist wahr, >dass ()dies eine Ausgabeumleitung und eine Unterschale bezeichnen kann, aber >(...)tatsächlich ein einzelnes, einheitliches Merkmal ist, das nicht aus >und besteht ().
Ruakh
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.