Je voudrais diriger la sortie standard d'un programme tout en le gardant à l'écran.
Avec un exemple simple ( echo
utilisez ici uniquement à des fins 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, car la sortie tee /dev/stdout
est dirigée versfoo
echo 'ee' | tee /dev/stderr
fonctionne cependant, donc si votre exigence "à l'écran" est satisfaite par stderr aussi, cela suffira.Réponses:
Voici une solution qui fonctionne sur n'importe quelle implémentation Unix / Linux, en supposant qu'elle se soucie de suivre la
POSIX
norme. Il fonctionne aussi sur certains environnements non Unixcygwin
.Référence: Les spécifications de base du groupe ouvert, numéro 7 IEEE Std 1003.1, 2013 Edition, §10.1 :
Il a été signalé que certains environnements comme Google Colab ne sont pas implémentés
/dev/tty
alors que leurtty
commande renvoyait un appareil utilisable. Voici une solution de contournement:ou avec un ancien obus Bourne:
la source
/dev/tty
est un appareil Unix obligatoire. Courez-vous dans une prison BSD?tee
comme ceci:cat some.log | tee /dev/tty | tee -a other.log | grep -i 'foo' >> foo.log
1) obtenir tout cela sur la console, 2) tout ajouter à un autre fichier, 3) obtenir lesfoo
lignes dans un fichier différent./dev/tty
, mais la sortie detty
est utilisable.Une autre chose à essayer est:
C'est
>(foo)
une substitution de processus .la source
foo
devra faire partie de la substitution du processus. Voici un exemple:echo 'ee' | tee file.txt >(wc -c | tr -d ' ')
echo 'ee' | tee >(cat) | foo | bar
.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.) comme:
Pour ajouter un décompte au bas d'une liste de fichiers correspondants, j'utilise quelque chose comme:
% ls [A-J]* | tee /dev/tty | wc -l
Pour éviter d'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
la source
Essayer:
Si l'utilisation de stderr est une option, bien sûr.
la source
vous devez d'abord déterminer le terminal associé à votre écran (ou l'écran sur lequel vous souhaitez que la sortie s'affiche):
alors vous pouvez envoyer la sortie sur ce terminal et diriger l'autre copie via votre programme foo:
la source
t
inutile. Vous pouvez utiliserecho ee | tee $(tty) | foo
mais il a toujours une commande inutile (tty
), étant donné/dev/tty
que cela fonctionne.