Donc, je comprends qu'en utilisant 'tee' je peux redirect la sortie d'une command telle que 'ping' vers stdout ainsi qu'un file.
Par exemple:
> ping google.com | tee somefile
Cela afficherait les statistics de ping sur le terminal et les écrirait dans 'somefile'.
Maintenant, si je souhaite modifier la sortie de 'ping', je peux utiliser 'couper' de cette façon:
> ping google.com | cut -d' ' -f 1
Mais, si je souhaite utiliser les trois commands set, je reçois une sortie non sur stdout et un file vide.
> ping google.com | cut -d' ' -f 1 | tee somefile
Qu'est-ce que je fais mal? Y a-t-il une meilleure manière de faire cela? D'une certaine manière, je sens que je n'utilise pas correctement le tee. Tout aperçu serait apprécié.
J'utilise shell bash, si cela est pertinent.
Les commands de votre pipe, en tant que destination non-terminal, mettent en memory tampon votre sortie. Il apparaîtra éventuellement, mais seulement lorsque beaucoup de sortie s'accumule ou que la command ping se ferme.
Vous pouvez utiliser ping -c 5 google.com
pour définir un nombre spécifique de packages à envoyer, puis ping quittera. Votre sortie revient et les tuyaux doivent fonctionner comme prévu.
Edit: une autre solution de contournement utilise stdbuf
pour éviter la mise en memory tampon des pipelines et awk
pour éviter une mise cut
tampon interne et permettre au ping de s'exécuter en continu:
ping www.google.com | stdbuf --output=0 awk '{print $1}' | tee /tmp/file