Cómo enviar la salida de un terminal a otro sin crear ninguna nueva tubería o archivo

26

Solo estoy jugando en mi terminal (terminal Gnome). Me preguntaba si hay una manera de enviar la salida de un terminal a otro sin tener que hacer un nuevo archivo o tubería.

por ejemplo: en el primer terminal ejecuto lsy quiero que su salida se muestre en el segundo terminal (con o sin usar ningún comando en el segundo)

Edward Torvalds
fuente
¿qué tienes? ¿Intentaste algo? ¿Puedes dar algunos ejemplos?
tachomi
@tachomi en la primera terminal que ejecuto lsy quiero que su salida se muestre en la segunda terminal (con o sin usar ningún comando en la segunda)
Edward Torvalds

Respuestas:

30

Si ambos terminales pertenecen al mismo usuario, puede enviar su salida al dispositivo virtual que se utiliza como tty del terminal en particular.

Entonces puede usar la salida de w, que incluye la información de TTY, y escribir directamente en ese dispositivo.

ls > /dev/pts/7

(Si el dispositivo mencionado por wera pts / 7)

Otra opción es usar el número de un proceso que está conectado a ese dispositivo. Envíe su salida a /proc/<process number>/fd/1.

ls > /proc/5555/fd/1

Suponiendo que el número de proceso que encontró que se ejecuta en ese terminal es 5555.

Tenga en cuenta que esta escritura directa solo se permite si el usuario que intenta escribir es el mismo usuario que posee el otro terminal .

RealSkeptic
fuente
No obtengo /dev/pts/7o similar con el wcomando, pero la segunda forma funciona para mí
Edward Torvalds
2
@edwardtorvalds El /proc/XXX/fd/1es generalmente un enlace suave al dispositivo base. Intente usar ls -l /proc/XXXX/fd/1y vea a qué apunta. ¿Tiene alguna relación con lo que apareció en el wcomando?
RealSkeptic
No estoy relacionando el wcomando con /proc/XXX/fd/0Estoy relacionando el wcomando con/dev/pts/7
Edward Torvalds
44
@edwardtorvalds Estoy diciendo que están conectados, ya que /proc/XXX/fd/1se supone que es un enlace suave a cualquier dispositivo que wmuestre el comando. ¿Cuál es el resultado de ls -lesto?
RealSkeptic
La información de TTY también se puede encontrar en la salida de tty(solo actual) o who(todos).
Nick Volynkin
14

Puedes usar el writecomando.

Como comentó @MelBurslan, si el permiso de escritura está desactivado, primero ejecute:

 $ mesg y

Desde man mesg

OPCIONES

y Permitir acceso de escritura a su terminal.

Uso de escritura:

$ write username tty

Por ejemplo, enviar lssalida a otro 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
fuente
en arch linux, en la terminal de gnome, la salida del wcomando es edward tty2 19:53 6:05 2:48 23.12s firefoxy si escribo ls | write edward tty2no obtengo más que un pitido
Edward Torvalds
@edwardtorvalds ¿Has liberado tecleaste en edwarddlugar de edward?
tachomi
también si lo intento en tty5 (ctrl + alt + 5) me sale un erroryou have turned write permission off
Edward Torvalds
eso fue un error de tipeo en este sitio
Edward Torvalds
pruebe el mesg ycomando en la terminal de destino, antes de ejecutar el comando
MelBurslan
7

Encontré un método similar.

En la primera terminal :

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

En la segunda terminal :

$ ls > /dev/pts/0

Ahora obtienes la salida en la primera terminal

Edward Torvalds
fuente
1
tail -fen lugar de catpodría ser útil
tachomi
3
@tachomi en realidad no hay necesidad de ningún comando para leer la salida
Edward Torvalds
4

Use el ttycomando en cada terminal para identificarlos:

$ tty
/dev/pts/0

$ tty
/dev/pts/1

Suponiendo estos TTY, para redirigir el stdout del primero al segundo, ejecute esto en el primer terminal:

exec 1>/dev/pts/1

Nota: Ahora cada salida de comando se mostrará en pts / 1

Para restaurar el comportamiento predeterminado stdout de pts / 0:

exec 1>/dev/pts/0

Vea este video para una demostración.

Vitalie Ghelbert
fuente
esta respuesta también es buena
Edward Torvalds
0

puedes escribir en el terminal TTY; por ejemplo:

en la terminal 1:

$ tty 
ttys000

en la terminal 2:

$ tty
ttys029

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

La salida se mostrará en ambos terminales en tiempo real, incluso mientras escribe.

Funciona en linux y macOS. La ruta TTY de macOS es /dev/{number}mientras que en Linux es/dev/pts/{number}

Miguel Mota
fuente
la ejecución exec &> >(tee >(cat >&/dev/ttys000))no existe, por lo que es imposible escribir.
Edward Torvalds
@EdwardTorvalds en Linux ttyserá algo así/dev/pts/0
Miguel Mota
sí, eso es lo que solía probar su código
Edward Torvalds
@EdwardTorvalds, ¿qué comando no existe?
Miguel Mota
su comando exec &> >(tee >(cat >&/dev/pts/1)). No funciona la combinación de teclas de control (ctrl + c). Tengo que matar la terminal para salir
Edward Torvalds
-3

Puedes usar walltambién:

$ wall "Message here"
Mahesh Morankar
fuente
quizás quieras describirlo en detalle. No entiendo nada de esto
Edward Torvalds
3
Definitivamente no desea usar wall(abreviatura de "escribir todo"), ya que escribe en cada sesión tty iniciada, incluida la que está enviando. En cambio, el uso writepermite que se declare un tty específico.
Monty Harder