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)

Edward Torvalds
la source
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 .

RealSkeptic
la source
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
tachomi
la source
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

Edward Torvalds
la source
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.

Vitalie Ghelbert
la source
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}

Miguel Mota
la source
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"
Mahesh Morankar
la source
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