Sortie directe sur tuyau et sortie standard


14

Je me demandais s'il y avait un moyen de diriger la sortie d'une commande et de la diriger vers la sortie standard. Ainsi, par exemple, fortuneimprime un cookie de fortune et le copie également dans le presse-papiers:

$ fortune | tee >(?stdout?) | pbcopy 
"...Unix, MS-DOS, and Windows NT (also known as the Good, the Bad, and
the Ugly)."
(By Matt Welsh)

Je n'ai pas mon OSX à portée de main, qu'en est-il fortune | tee $(tty) | pbcopy?
Archemar

Réponses:


9

Votre hypothèse:

fortune | tee >(?stdout?) | pbcopy

ne fonctionnera pas car la fortunesortie sera écrite deux fois en sortie standard, vous doublerez donc la sortie pbcopy.

Dans OSX (et la prise en charge d'autres systèmes /dev/std{out,err,in}), vous pouvez le vérifier:

$ echo 1 | tee /dev/stdout | sed 's/1/2/'
2
2

sortie 2deux fois au lieu de 1et 2.

Vous devez utiliser d'autres descripteurs de fichiers, exemple d'erreur standard via /dev/stderr:

$ echo 1 | tee /dev/stderr | sed 's/1/2/'
1
2

ou utilisez ttypour obtenir le pseudo terminal connecté:

$ echo 1 | tee "$(tty)" | sed 's/1/2/'
1
2

Avec zshet multiosensemble d'options, vous n'avez pas besoin teedu tout:

$ echo 1 >/dev/stderr | sed 's/1/2/'
1
2

tee $(tty)Ou, tu sais,tee /dev/tty
Kenster

grande explication, top réponse SO tout autour.
Merlin

10

teeécrit toujours sur sa sortie standard. Si vous souhaitez envoyer les données à une commande en plus du terminal où la sortie standard va déjà, utilisez simplement la substitution de processus avec cette commande. (Notez que malgré le début >, la substitution de processus ne redirige pas la sortie standard, la teecommande la considère comme un paramètre.)

fortune | tee >(pbcopy)

C'est bien, c'est aussi une bonne solution.
Merlin

0

cuonglm a tout dit.

Essayez simplement:

fortune | tee "$(tty)" | pbcopy

ttydevrait se résoudre à un pseudo terminal réel (comme /dev/pts/99) dans une session interactive (c'est-à-dire dans un terminal), ou pas de tty en lot, sur et démon.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.