Come convogliare lo stdout mantenendolo sullo schermo? (e non a un file di output)

Mi piacerebbe unire l’output standard di un programma mantenendolo sullo schermo.

Con un semplice esempio (l’uso echo qui è solo a scopo illustrativo):

$ echo 'ee' | foo
ee <- l'output che mi piacerebbe vedere

So che il tee potrebbe copiare lo stdout in un file, ma non è quello che voglio.
$ echo 'ee' | tee output.txt | foo

Provai
$ echo 'ee' | tee /dev/stdout | foo $ echo 'ee' | tee /dev/stdout | foo ma non funziona poichè l’output di tee su /dev/stdout viene inviato a foo

Ecco una soluzione che funziona su qualsiasi implementazione Unix / Linux, supponendo che si preoccupi di seguire lo standard POSIX . Funziona su alcuni ambienti non Unix come cygwin .

 echo 'ee' | tee /dev/tty | foo 

Riferimento: The Open Group Base Specifications Numero 7 IEEE Std 1003.1, 2013 Edition, §10.1 :

/ dev / tty

Associato al gruppo di processi di quel processo, se presente. È utile per i programmi o le procedure di shell che desiderano essere sicuri di scrivere messaggi o leggere dati dal terminale, indipendentemente dal modo in cui l’output è stato reindirizzato. Può anche essere usato per applicazioni che richiedono il nome di un file per l’output, quando l’output digitato è desiderato ed è faticoso scoprire quale terminale è attualmente in uso. In ogni processo, un sinonimo per il terminale di controllo

Un’altra cosa da provare è:

 echo 'ee' | tee >(foo) 

Il >(foo) è una sostituzione di processo .

Provare:

 $ echo 'ee' | tee /dev/stderr | foo 

Se usare stderr è un’opzione, ovviamente.

L’accesso a “/ dev / stdout” è negato su alcuni sistemi, ma l’accesso al terminale utente è dato da “/ dev / tty”. Usando “wc” per “foo”, gli esempi sopra funzionano OK (su linux, OSX, ecc.) Come:

% echo 'Hi' | tee /dev/tty | wc Hi 1 1 3

Per aggiungere un conteggio in fondo a un elenco di file corrispondenti, io uso qualcosa come:
% ls [AJ]* | tee /dev/tty | wc -l

Per evitare di dover ricordare tutto ciò, definisco gli alias:
% alias t tee /dev/tty
% alias wcl wc -l

così posso semplicemente dire:
% ls [AJ]* | t | wcl


POSTSCRIPT: Per il set più giovane, che potrebbe titrezionare la sua pronuncia come “titty”, potrei aggiungere che “tty” era una volta l’abbreviazione comune per un terminale “teletype”, che usava un rotolo di carta gialla e aveva tasti rotondi che spesso incollato.

per prima cosa devi capire il terminale associato al tuo schermo (o a quale schermo vuoi che venga mostrato l’output):

 tty 

quindi puoi colbind l’output a quel terminale e inviare l’altra copia attraverso il tuo programma foo:

 echo ee | tee /dev/pty/2 | foo