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
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
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.
Essayer:
$ echo 'ee' | tee /dev/stderr | foo
Si utiliser stderr est une option, bien sûr.
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