Qual è il nome della funzione di shell `> (tee copyError.txt> & 2)`?


11

Devo registrare stdout e stderr nei file di log, ma mostrare solo i messaggi di errore sullo schermo. Posso farlo con:

cp -rpv a/* b 1> copyLog.txt 2> >(tee copyError.txt >&2) 

Che ho trovato da qualche parte nel web.

Voglio solo sapere come >(tee copyError.txt >&2)si chiama questa cosa? Non posso cercarlo su Google, dato che Google ignora caratteri come parentesi angolari e parentesi.


Reindirizzamento dei file ( tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-3.html )
Kartik

@terdon Penso che l'OP abbia dichiarato di voler registrare StdOut e StdErr su file, ma mostra comunque anche StdErr sullo schermo
Dmitry Avtonomov,

Risposte:


11

Da 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.

Puoi cercare le manpage premendo /e digitando la stringa di ricerca, il che è un buon modo per trovare informazioni come questa. Ovviamente richiede che tu sappia in quale manpage cercare :)

Devi citare il (però, perché ha un significato speciale durante la ricerca. Per trovare la sezione pertinente nella manpage di bash, digitare />\(.


Faccio molto bash, quindi ho fatto un uomo bash> bashman.txt e l'ho fatto solo in lettura. Ora, posso caricare bashman.txt in un'altra finestra del mio editor di testo (sola lettura) e utilizzare tutte le funzionalità dell'editor per cercare, copiare e incollare.
Joe,

8

>(tee copyError.txt >&2) è in realtà alcune funzionalità diverse:

  • >(...)si chiama "sostituzione di processo". Crea un file di pipe denominato/dev/fd e la scrittura in quel file fornirà l'input al processo tra parentesi.

  • >: In generale, questo si chiama "reindirizzamento dell'output" e consente di inviare output standard ( >o 1>) o errore standard ( 2>) a un file o processo. >&2è il reindirizzamento dell'output ma in questo caso, l'output di teeviene inviato all'errore standard (ecco cos'è &2, &1è l'output standard)

  • Senza >, parentesi ( ()) avvierà una subshell. L'esecuzione dei comandi tra parentesi genererà un'altra shell che esisterà solo fintanto che quei comandi sono in esecuzione. Puoi vedere come funziona se dichiari una variabile nella subshell:

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

    Come puoi vedere, quello $fooche è stato definito nella subshell è separato da quello definito nella shell parent.


4
No >(...)non è un reindirizzamento. >(...)viene espanso in un nome file. Se si desidera reindirizzare l' output a quello, è necessario > >(...)ma >(...)è più generalmente utilizzato dove non è possibile utilizzare i reindirizzamenti. Il comando dell'OP può essere ottenuto con tubi tradizionali, non è necessario sostituirlo al processo.
Stéphane Chazelas,

@StephaneChazelas Sarebbe bello vedere la soluzione che avevi in ​​mente
Dmitry Avtonomov

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

@StephaneChazelas thx!
Dmitry Avtonomov,

La prima metà di questa risposta è sbagliata, o almeno altamente fuorviante; è vero che >può indicare il reindirizzamento dell'output e che ()può indicare una subshell, ma in >(...)realtà è una singola funzionalità unitaria che non è composta da >e ().
Ruakh,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.