Significato di '2>> (comando)' Reindirizzamento in Bash


18

Qualche tempo fa ho creato uno script e ho aggiunto un po 'di registrazione, ma ho dimenticato come funziona il reindirizzamento per la registrazione :-(

L'essenza è:

#!/bin/bash

LOGFILE=/some/path/mylogfile

(
  # here go my commands which produce some stdout
  # and, if something goes wrong, also some stderr
) 1>>${LOGFILE} 2> >( tee -a ${LOGFILE} >&2 )

Quando eseguo la sceneggiatura, non stampa nulla stdout, ma stampa solo ciò che accade stderr. Logfile ${LOGFILE}cattura sia stdout che stderr.

Quando eseguo lo script e non c'è output sul mio terminale, allora so che va tutto bene. Se c'è qualche output, so che qualcosa è andato storto e posso controllare il file di registro per scoprire qual è il problema.

La parte del reindirizzamento che ora mi confonde è la sintassi di: 2> >( some command )

Qualcuno può spiegare cosa sta succedendo lì?

Risposte:


23

>(...)si chiama sostituzione di processo . Permette al programma "esterno" di scrivere nel programma "interno" come se fosse un file.

In questo caso è la scrittura stderra tee -a ${LOGFILE} >&2cui verrà aggiunta LOGFILEe quindi anche la scrittura di tutto stderr.

L'operatore di reindirizzamento può andare in entrambe le direzioni per la sostituzione del processo, quindi è possibile scrivere su di esso, come in questo esempio, o usare <(...)per leggere da esso, che è un modo pratico per, ad esempio, fare un whileciclo senza eseguirlo in una subshell si.


5
Capito :-) Se eseguo echo <(date), mi dà il nome del file sostituito: /dev/fd/63. Se eseguo cat <(date), mi dà la data, vale a dire il contenuto del file sostituito: Fri Nov 18 14:11:09 NZDT 2016.
NZD,

@NZD, sì - ma non immagini che sia un file normale - quello che vedi /devè un nome per la pipe tra i processi.
Toby Speight,

Questa tecnica viene utilizzata perché non è possibile eseguire il piping di stderr ( teein questo caso)?
bli

@bli Sì, dato che stdout è già stato reindirizzato altrove, questo mi sembra il modo più semplice per teestderr e tenerlo separato da stdout.
Eric Renouf,
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.