`tee` pour les commandes

15

teepeut rediriger l'entrée standard canalisée vers la sortie et le fichier standard .

echo Hello, World! | tee greeting.txt

La commande ci-dessus afficherait le message d'accueil sur l'écran du terminal et l'enregistrerait dans le contenu du greeting.txtfichier, créant le fichier s'il n'y en a pas de ce nom.

Il y a aussi un -acommutateur pour teeajouter au fichier existant au lieu de l'écraser.


Existe-t-il un moyen pratique de rediriger l'entrée canalisée vers la commande et la sortie standard au lieu du fichier?

J'essaie de créer un script wrapper pour bukucopier dans la sélection principale l'URL du signet spécifié par son numéro d'index.

# bukuc:
#!/bin/sh
url=$(buku -f 1 -p $1 | cut -f 2) # NUMBER : URL
echo $url # DISPLAY
echo $url | xsel # PRIMARY SELECTION

Ici, j'utilise echo deux fois, d'abord pour l'affichage sur le terminal, puis l'enregistrement dans la sélection principale (presse-papiers).

J'imagine quelque chose echo $url | teeC xselou un raccourci pour afficher la sortie avant de passer à la commande suivante (commandes de chaînage), ce qui me permettrait de chaîner la commande entière sur une seule ligne sans avoir besoin d'enregistrer le résultat dans une variable comme suit:

buku -f 1 -p $1 | cut -f 2 | teeC xsel    

Je peux également l'utiliser avec urlviewpour afficher, sélectionner et ouvrir avec les éléments $BROWSERsuivants:

bukuc 10-20 | urlview

la source
3
Essayez tee /dev/ttyou tty0(ne vous souvenez pas exactement ... je suis sur la route)
George Vasiliou
2
info teementionne la substitution de processus, et la sortie de pipe tee à un programme ...
Xen2050

Réponses:

19

C'est simple dans les shells qui supportent la substitution de processus , par exemple bash

$ echo foo | tee >(xsel)
foo
$ xsel -o
foo

Sinon, vous pourriez utiliser un FIFO (bien qu'il manque de commodité)

$ mkfifo _myfifo
$ xsel < _myfifo &
$ echo bar | tee _myfifo
bar
$ xsel -o
bar
[1] + Done                       xsel 0<_myfifo
$ 
tournevis
la source
Merci! Deux choses que j'ai notées: 1. sh(Bourne shell) ne prend pas en charge cette fonctionnalité; 2. La flèche doit rester en tant que partie de l'opérateur unique >()pour la substitution de processus.
11

L'analogue direct de "tee for peecommand " est la commande de moreutils ( tee, mais avec des tuyaux). Ses arguments sont utilisés comme des commandes à exécuter, pas comme des chemins d'accès, et ils obtiennent l'entrée dirigée vers eux plutôt que écrits dans un fichier. Toutes les commandes reçoivent l'entrée standard à laquelle vous avez acheminé peecomme leur propre propriété.

En utilisant pee, vous pouvez obtenir le résultat souhaité en lui disant de s'exécuter à la fois xselet catavec l'entrée.

echo foo | pee xsel cat

Il y a un catprocessus supplémentaire flottant pour faire la sortie, ce qui n'est pas vraiment un problème pour votre cas d'utilisation mais pourrait être moins idéal à d'autres moments. Cela fonctionne avec n'importe quel shell, contrairement à la substitution de processus, mais bien sûr, il nécessite l'installation d'un outil supplémentaire (probablement moins courant).

Vous pouvez donner des commandes plus complexes en les citant: pee "xsel --display :1" cat. Ils sont exécutés avec sh, vous devez donc faire attention aux métacaractères shell.

Michael Homer
la source
4
Très cool - je n'en savais rien
steeldriver
2
Ce n'est pas un bon nom.
David Richerby