web-dev-qa-db-fra.com

Comment diriger stdout tout en le gardant à l'écran? (et pas dans un fichier de sortie)

J'aimerais éditer la sortie standard d'un programme tout en la gardant à l'écran.

Avec un exemple simple (echo à utiliser uniquement à titre d’illustration):

$ echo 'ee' | foo
ee <- la sortie que j'aimerais voir

Je sais que tee pourrait copier stdout dans un fichier, mais ce n’est pas ce que je veux.
$ echo 'ee' | tee output.txt | foo

J'ai essayé
$ echo 'ee' | tee /dev/stdout | foo mais cela ne fonctionne pas depuis la sortie tee vers /dev/stdout est connecté à foo

204
gentooboontoo

Voici une solution qui fonctionne avec n'importe quelle implémentation Unix/Linux, en supposant qu'elle respecte le standard POSIX. Cela fonctionne aussi sur des environnements non Unix comme cygwin.

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

Référence: Spécifications de base de Open Group, édition 7, norme IEEE 1003.1, Édition 2013, §10.1 :

/dev/tty

Associé au groupe de processus de ce processus, le cas échéant. Il est utile pour les programmes ou les procédures Shell qui souhaitent être sûrs d'écrire des messages dans ou de lire des données depuis du terminal. quelle que soit la manière dont la sortie a été redirigée. Elle peut également être utilisée pour les applications qui demandent le nom d’un fichier pour la sortie, lorsque la sortie typée est souhaitée et qu’il est fastidieux de savoir quel terminal est actuellement utilisé. utilisé. Dans chaque processus, un synonyme pour le terminal de contrôle

Il a été signalé que certains environnements tels que Google Colab ne mettaient pas en œuvre /dev/tty tout en ayant toujours leur commande tty renvoyant un périphérique utilisable. Voici une solution de contournement:

tty=$(tty)
echo 'ee' | tee $tty | foo

ou avec un ancien Bourne Shell:

tty=`tty`
echo 'ee' | tee $tty | foo
295
jlliagre

Une autre chose à essayer est:

echo 'ee' | tee >(foo)

La >(foo) est un substitution de processus .

59
bmk

L'accès à "/ dev/stdout" est refusé sur certains systèmes, mais l'accès au terminal utilisateur est donné par "/ dev/tty". En utilisant "wc" pour "foo", les exemples ci-dessus fonctionnent correctement (sous Linux, OSX, etc.) en tant que:

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

Pour ajouter un compte au bas d'une liste de fichiers correspondants, j'utilise quelque chose comme:
% ls [A-J]* | tee /dev/tty | wc -l

Pour ne pas avoir à me souvenir de tout cela, je définis des alias:
% alias t tee /dev/tty
% alias wcl wc -l

pour que je puisse simplement dire:
% ls [A-J]* | t | wcl


POSTSCRIPT: Pour les plus jeunes, qui pourraient dire que sa prononciation est "titty", je pourrais ajouter que "tty" était autrefois l’abréviation usuelle d’un terminal "télétype", qui utilisait un rouleau de papier jaune et avait touches rondes souvent bloquées.

18
user51527

Essayer:

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

Si utiliser stderr est une option, bien sûr.

15
Jan

vous devez d’abord déterminer le terminal associé à votre écran (ou l’écran sur lequel vous souhaitez afficher la sortie):

tty

vous pouvez ensuite relier la sortie à ce terminal et diriger l’autre copie dans votre programme foo:

echo ee | tee /dev/pty/2 | foo
8
Michael Martinez