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.