Como enviar a saída de um terminal para outro sem criar nenhum novo tubo ou arquivo

26

Estou apenas brincando no meu terminal (terminal Gnome). Fiquei me perguntando se existe uma maneira de enviar a saída de um terminal para outro sem ter que criar um novo arquivo ou canal.

por exemplo: no primeiro terminal, corro lse quero que sua saída seja exibida no segundo terminal (com ou sem usar qualquer comando no segundo)

Edward Torvalds
fonte
o que você tem? Você tentou alguma coisa? Voce pode dar alguns exemplos?
Tachomi
@tachomi no primeiro I run do terminal lse quer a sua saída para ser exibido em segundo terminal (com ou sem utilizar qualquer comando no segundo)
Edward Torvalds

Respostas:

30

Se os dois terminais pertencerem ao mesmo usuário, você poderá enviar sua saída para o dispositivo virtual usado como o tty do terminal específico.

Portanto, você pode usar a saída de w, que inclui as informações TTY, e gravar diretamente nesse dispositivo.

ls > /dev/pts/7

(Se o dispositivo mencionado por wera pts / 7)

Outra opção é usar o número de um processo conectado ao dispositivo. Envie sua saída para /proc/<process number>/fd/1.

ls > /proc/5555/fd/1

Supondo que o número do processo que você encontrou que é executado nesse terminal seja 5555.

Observe que essa gravação direta é permitida apenas se o usuário que tentar gravar for o mesmo usuário que possui o outro terminal .

RealSkeptic
fonte
Eu não entendo /dev/pts/7ou similar com wcomando, mas segunda maneira funciona para mim
Edward Torvalds
2
@edwardtorvalds /proc/XXX/fd/1Geralmente é um link direto para o dispositivo base. Tente usar ls -l /proc/XXXX/fd/1e veja o que está apontando. Tem alguma relação com o que apareceu no wcomando?
RealSkeptic
Não estou relatando wcomando com /proc/XXX/fd/0Estou relatando wcomando com/dev/pts/7
Edward Torvalds /
4
@edwardtorvalds Estou dizendo que eles estão conectados, como /proc/XXX/fd/1deveria ser um link para qualquer dispositivo que o wcomando exibir. Qual é a saída ls -ldele?
RealSkeptic
As informações TTY também podem ser encontradas na saída de tty(somente atual) ou who(todos).
precisa
14

Você pode usar o writecomando

Como o @MelBurslan comentou, se a permissão de gravação estiver desativada, primeiro execute:

 $ mesg y

A partir de man mesg

OPÇÕES

y Permitir acesso de gravação ao seu terminal.

Uso de gravação:

$ write username tty

por exemplo, envie a lssaída para outro 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
fonte
no Arch Linux, em gnome terminal, saída do wcomando é edward tty2 19:53 6:05 2:48 23.12s firefoxe se eu escrever ls | write edward tty2fico sem saída, mas um sinal sonoro
Edward Torvalds
@edwardtorvalds Você liberou você digitou em edwarddvez de edward?
Tachomi
Também se eu experimentá-lo em tty5 (ctrl + alt + 5) Recebo erroyou have turned write permission off
Edward Torvalds
que estava digitando um erro neste site
Edward Torvalds
tente mesg ycomando no terminal alvo, antes de executar o comando
MelBurslan
7

Eu encontrei um método semelhante.

No primeiro terminal :

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

No segundo terminal :

$ ls > /dev/pts/0

Agora você obtém a saída no primeiro terminal

Edward Torvalds
fonte
1
tail -fao invés de catpoderia ser útil
tachomi
3
@tachomi realmente não há necessidade de qualquer comando para ler a saída
Edward Torvalds
4

Use o ttycomando em cada terminal para identificá-los:

$ tty
/dev/pts/0

$ tty
/dev/pts/1

Supondo que esses TTYs, para redirecionar o stdout do primeiro para o segundo, execute isso no primeiro terminal:

exec 1>/dev/pts/1

Nota: Agora toda saída de comando será exibida em pts / 1

Para restaurar o comportamento padrão stdout de pts / 0:

exec 1>/dev/pts/0

Veja este vídeo para uma demonstração.

Vitalie Ghelbert
fonte
esta resposta também é boa
Edward Torvalds
0

você pode escrever no TTY do terminal; por exemplo:

no terminal 1:

$ tty 
ttys000

no terminal 2:

$ tty
ttys029

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

A saída será exibida nos dois terminais em tempo real, enquanto você digita.

Funciona em linux e macOS. O caminho do macOS TTY é /dev/{number}enquanto no Linux é/dev/pts/{number}

Miguel Mota
fonte
a execução exec &> >(tee >(cat >&/dev/ttys000))não existe, impossibilitando a digitação.
Edward Torvalds
@EdwardTorvalds no linux ttyserá algo como/dev/pts/0
Miguel Mota
sim, é isso que eu costumava testar seu código
Edward Torvalds
@EdwardTorvalds que comando não existe?
Miguel Mota
seu comando exec &> >(tee >(cat >&/dev/pts/1)). Nenhuma combinação de teclas de controle (ctrl + c) funciona. Eu tenho que matar o terminal para sair
Edward Torvalds
-3

Você walltambém pode usar :

$ wall "Message here"
Mahesh Morankar
fonte
você pode descrevê-lo em detalhes. Eu não entendo nada disso
Edward Torvalds
3
Você definitivamente não deseja usar wall(abreviação de "write all"), como ele grava em todas as sessões tty logadas, incluindo a que você está enviando. Em vez disso, o uso writepermite que um tty específico seja declarado.
Monty Mais difícil