Comment envoyer la sortie d'un terminal à un autre sans créer de nouveau canal ou fichier


26

Je suis juste en train de batifoler sur mon terminal (terminal Gnome). Je me demandais s'il y avait un moyen d'envoyer la sortie d'un terminal à un autre sans avoir à créer un nouveau fichier ou pipe.

par exemple: sur le premier terminal, je cours lset je veux que sa sortie soit affichée sur le second terminal (avec ou sans utiliser de commande sur le second)


Qu'est-ce que tu as? Avez-vous essayé quelque chose? Peux-tu donner quelques exemples?
tachomi

@tachomi sur le premier terminal que je lance lset souhaite que sa sortie soit affichée sur le deuxième terminal (avec ou sans aucune commande sur le second)
Edward Torvalds

Réponses:


30

Si les deux terminaux appartiennent au même utilisateur, vous pouvez envoyer votre sortie au périphérique virtuel qui est utilisé comme terminal du terminal particulier.

Vous pouvez donc utiliser la sortie de w, qui inclut les informations TTY, et écrire directement sur cet appareil.

ls > /dev/pts/7

(Si l'appareil mentionné par wétait pts / 7)

Une autre option consiste à utiliser le numéro d'un processus connecté à ce périphérique. Envoyez votre sortie à /proc/<process number>/fd/1.

ls > /proc/5555/fd/1

En supposant que le numéro de processus que vous avez trouvé qui s'exécute dans ce terminal est 5555.

Notez que cette écriture directe n'est autorisée que si l'utilisateur qui tente d'écrire est le même utilisateur qui possède l'autre terminal .


Je ne reçois pas /dev/pts/7ou similaire avec la wcommande, mais la deuxième façon fonctionne pour moi
Edward Torvalds

2
@edwardtorvalds Le /proc/XXX/fd/1est généralement un lien logiciel vers le périphérique de base. Essayez d'utiliser ls -l /proc/XXXX/fd/1et voyez ce qu'il pointe. Cela a-t-il un rapport avec ce qui est apparu dans la wcommande?
RealSkeptic

Je ne fais pas le lien wavec le commandement /proc/XXX/fd/0Je fais le lien wavec le commandement/dev/pts/7
Edward Torvalds

4
@edwardtorvalds Je dis qu'ils sont connectés comme /proc/XXX/fd/1c'est censé être un lien logiciel vers n'importe quel périphérique que la wcommande affiche. Quelle est la sortie de ls -lcelui-ci?
RealSkeptic

Les informations ATS peuvent également être trouvées dans la sortie de tty(uniquement le courant) ou who(tous).
Nick Volynkin

14

Vous pouvez utiliser la writecommande.

Comme l'a commenté @MelBurslan, si l'autorisation d'écriture est désactivée, exécutez d'abord:

 $ mesg y

De man mesg

OPTIONS

y Autorisez l'accès en écriture à votre terminal.

Utilisation de l'écriture:

$ write username tty

Par exemple, envoyer la lssortie à un autre terminal.

$ w
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
user     :0       :0               08:15   ?xdm?   7:37   0.25s init --user
user     pts/0    :0               08:19    1.00s  0.09s  0.01s w
user     pts/12   :0               08:50   54.00s  0.03s  0.03s bash

$ ls | write username pts/12

sur arch linux, dans le terminal gnome, la sortie de la wcommande est edward tty2 19:53 6:05 2:48 23.12s firefoxet si j'écris ls | write edward tty2je n'obtiens aucune sortie mais un bip sonore
Edward Torvalds

@edwardtorvalds Vous avez publié que vous avez tapé à la edwarddplace de edward?
tachomi

aussi si je l'essaye sur tty5 (ctrl + alt + 5) j'obtiens une erreuryou have turned write permission off
Edward Torvalds

qui tapait une erreur sur ce site
Edward Torvalds

essayez la mesg ycommande sur le terminal cible, avant d'exécuter la commande
MelBurslan

7

J'ai trouvé une méthode similaire.

Sur le premier terminal :

 $ tty
 /dev/pts/0
 $ <no need to run any command here, just see the output>

Sur le deuxième terminal :

$ ls > /dev/pts/0

Maintenant, vous obtenez la sortie sur le premier terminal


1
tail -fau lieu de catpourrait être utile
tachomi

3
@tachomi en fait, aucune commande n'est nécessaire pour lire la sortie
Edward Torvalds

4

Utilisez la ttycommande dans chaque terminal pour les identifier:

$ tty
/dev/pts/0

$ tty
/dev/pts/1

En supposant que ces ATS, pour rediriger la sortie standard du premier vers le second, exécutez ceci dans le premier terminal:

exec 1>/dev/pts/1

Remarque: Maintenant, chaque sortie de commande s'affiche sur pts / 1

Pour restaurer le comportement par défaut stdout de pts / 0:

exec 1>/dev/pts/0

Voir cette vidéo pour une démonstration.


cette réponse est également bonne
Edward Torvalds

0

vous pouvez écrire sur le TTY du terminal; par exemple:

dans le terminal 1:

$ tty 
ttys000

dans la borne 2:

$ tty
ttys029

$ exec &> >(tee >(cat >&/dev/ttys000))
ls 

La sortie s'affichera dans les deux terminaux en temps réel, même lorsque vous tapez.

Fonctionne sur linux et macOS. Le chemin macOS TTY est /dev/{number}alors que sous Linux c'est/dev/pts/{number}


l'exécution exec &> >(tee >(cat >&/dev/ttys000))n'existe pas, ce qui rend impossible la saisie.
Edward Torvalds le

@EdwardTorvalds sur linux ttysera quelque chose comme/dev/pts/0
Miguel Mota

oui, c'est ce que j'ai utilisé pour tester votre code
Edward Torvalds

@EdwardTorvalds quelle commande n'existe pas?
Miguel Mota

votre commande exec &> >(tee >(cat >&/dev/pts/1)). Aucune combinaison de touches de contrôle (ctrl + c) ne fonctionne. Je dois tuer le terminal pour sortir
Edward Torvalds

-3

Vous pouvez wallégalement utiliser :

$ wall "Message here"

vous voudrez peut-être le décrire en détail. Je ne comprends rien de tout cela
Edward Torvalds

3
Vous ne voulez certainement pas utiliser wall(abréviation de "écrire tout"), car il écrit dans chaque session tty connectée, y compris celle à partir de laquelle vous envoyez. À la place, l'utilisation writepermet de déclarer un tty spécifique.
Monty Harder
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.