Come inviare l'output da un terminale a un altro senza creare nuove pipe o file


26

Sto solo scherzando sul mio terminale (terminale Gnome). Mi chiedevo c'è un modo per inviare l'output di un terminale a un altro senza dover creare un nuovo file o pipe.

per esempio: sul primo terminale corro lse voglio che il suo output sia visualizzato sul secondo terminale (con o senza usare alcun comando sul secondo)


Cosa hai? Hai provato qualcosa? Puoi fare qualche esempio?
— Tachomi,

@tachomi sul primo terminale Corro lse voglio che il suo output sia visualizzato sul secondo terminale (con o senza usare alcun comando sul secondo)
— Edward Torvalds

Risposte:


30

Se entrambi i terminali appartengono allo stesso utente, è possibile inviare l'output al dispositivo virtuale utilizzato come tty del terminale specifico.

Quindi puoi usare l'output di w, che include le informazioni TTY, e scrivere direttamente su quel dispositivo.

ls > /dev/pts/7

(Se il dispositivo menzionato da wera pts / 7)

Un'altra opzione è quella di utilizzare il numero di un processo connesso a quel dispositivo. Invia il tuo output a /proc/<process number>/fd/1.

ls > /proc/5555/fd/1

Supponendo che il numero di processo trovato in quel terminale sia 5555.

Si noti che questa scrittura diretta è consentita solo se l'utente che tenta di scrivere è lo stesso utente proprietario dell'altro terminale .


Non ricevo /dev/pts/7o simile con il wcomando, ma il secondo modo funziona per me
— Edward Torvalds,

2
@edwardtorvalds /proc/XXX/fd/1È generalmente un collegamento software al dispositivo di base. Prova a usare ls -l /proc/XXXX/fd/1e vedi a cosa sta puntando. Ha qualche relazione con ciò che è apparso nel wcomando?
— RealSkeptic,

Non parlo di wcomando con /proc/XXX/fd/0Mi parlo di wcomando con/dev/pts/7
— Edward Torvalds,

4
@edwardtorvalds Sto dicendo che sono collegati come /proc/XXX/fd/1si suppone che sia un soft link a qualunque dispositivo venga wvisualizzato il comando. Qual è l'output di ls -lsu di esso?
— RealSkeptic,

Le informazioni TTY possono anche essere trovate nell'output da tty(solo corrente) o who(tutto).
— Nick Volynkin,

14

Puoi usare il writecomando.

Come ha commentato @MelBurslan, se l'autorizzazione di scrittura è disattivata, eseguire innanzitutto:

 $ mesg y

A partire dal man mesg

OPZIONI

y Consentire l'accesso in scrittura al terminale.

Utilizzo di scrivere:

$ write username tty

ad es. inviare lsoutput ad altri terminali.

$ 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

su arch linux, nel terminale gnome, l'output del wcomando è edward tty2 19:53 6:05 2:48 23.12s firefoxe se scrivo ls | write edward tty2non ottengo alcun output ma un suono bip
— Edward Torvalds

@edwardtorvalds Hai rilasciato digitato edwarddinvece di edward?
— Tachomi,

anche se lo provo su tty5 (ctrl + alt + 5) ottengo un erroreyou have turned write permission off
— Edward Torvalds,

che stava scrivendo un errore in questo sito
— Edward Torvalds,

provare il mesg ycomando sul terminale di destinazione, prima di eseguire il comando
— MelBurslan

7

Ho trovato un metodo simile.

Sul primo terminale :

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

Sul secondo terminale :

$ ls > /dev/pts/0

Ora ottieni l'output sul primo terminale


1
tail -finvece di catpotrebbe essere utile
— tachomi l'

3
@tachomi in realtà non è necessario alcun comando per leggere l'output
— Edward Torvalds,

4

Utilizzare il ttycomando in ciascun terminale per identificarli:

$ tty
/dev/pts/0

$ tty
/dev/pts/1

Supponendo che questi TTY, per reindirizzare il primo stdout al secondo, eseguirlo nel primo terminale:

exec 1>/dev/pts/1

Nota: ora ogni output di comando verrà mostrato su pts / 1

Per ripristinare il comportamento predefinito stdout di pts / 0:

exec 1>/dev/pts/0

Guarda questo video per una dimostrazione.


anche questa risposta è buona
— Edward Torvalds l'

0

puoi scrivere sul terminale TTY; per esempio:

nel terminal 1:

$ tty 
ttys000

nel terminal 2:

$ tty
ttys029

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

L'output verrà mostrato in entrambi i terminali in tempo reale anche durante la digitazione.

Funziona su Linux e MacOS. Il percorso macOS TTY è /dev/{number}mentre su Linux lo è/dev/pts/{number}


l'esecuzione exec &> >(tee >(cat >&/dev/ttys000))non esiste, rendendo impossibile la digitazione.
— Edward Torvalds,

@EdwardTorvalds su Linux ttysarà qualcosa del genere/dev/pts/0
— Miguel Mota il

Sì, è quello che ho usato per testare il tuo codice
— Edward Torvalds,

@EdwardTorvalds quale comando non esiste?
— Miguel Mota,

il tuo comando exec &> >(tee >(cat >&/dev/pts/1)). Nessuna combinazione di tasti di controllo (ctrl + c) funziona. Devo uccidere il terminal per uscire
— Edward Torvalds il

-3

Puoi usare wallanche:

$ wall "Message here"

potresti voler descriverlo in dettaglio. Non capisco niente da questo
— Edward Torvalds,

3
Non vorrai assolutamente usarlo wall(abbreviazione di "scrivi tutto"), poiché scrive in ogni sessione tty connessa, inclusa quella da cui stai inviando. Invece, l'utilizzo writeconsente di dichiarare un tty specifico.
— Monty Harder,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.