Jak wysłać dane wyjściowe z jednego terminala do drugiego bez tworzenia nowego potoku lub pliku


26

Wygłupiam się na moim terminalu (terminal Gnome). Zastanawiałem się, czy istnieje sposób na przesłanie danych wyjściowych z jednego terminala do drugiego bez konieczności tworzenia nowego pliku lub potoku.

na przykład: na pierwszym terminalu uruchamiam lsi chcę, aby jego dane wyjściowe były wyświetlane na drugim terminalu (z lub bez użycia jakiegokolwiek polecenia na drugim)


co masz? Próbowałeś czegoś? Czy możesz podać jakieś przykłady?
tachomi

@tachomi na pierwszym terminalu Uruchomię lsi chcę, aby jego dane wyjściowe były wyświetlane na drugim terminalu (z lub bez użycia komendy na drugim)
Edward Torvalds

Odpowiedzi:


30

Jeśli oba terminale należą do tego samego użytkownika, możesz wysłać dane wyjściowe do urządzenia wirtualnego, które jest używane jako tty określonego terminala.

Możesz więc użyć danych wyjściowych w, które zawierają informacje TTY, i pisać bezpośrednio na tym urządzeniu.

ls > /dev/pts/7

(Jeśli wspomniane urządzenie wto pts / 7)

Inną opcją jest użycie numeru procesu podłączonego do tego urządzenia. Wyślij swój wynik do /proc/<process number>/fd/1.

ls > /proc/5555/fd/1

Zakładając, że znaleziony numer procesu działający w tym terminalu to 5555.

Należy pamiętać, że ten bezpośredni zapis jest dozwolony tylko wtedy, gdy użytkownik, który próbuje zapisać, jest tym samym użytkownikiem, który jest właścicielem drugiego terminala .


Nie otrzymuję /dev/pts/7podobnego wpolecenia, ale dla mnie działa drugi sposób
Edward Torvalds,

2
@edwardtorvalds Jest /proc/XXX/fd/1to ogólnie miękkie łącze do urządzenia podstawowego. Spróbuj użyć ls -l /proc/XXXX/fd/1i zobacz, na co to wskazuje. Czy ma to jakiś związek z tym, co pojawiło się w wpoleceniu?
RealSkeptic

Nie odnoszę się do wpolecenia, /proc/XXX/fd/0odnoszę się do - odnoszę się do wpolecenia/dev/pts/7
Edward Torvalds,

4
@edwardtorvalds Mówię, że są one połączone, ponieważ /proc/XXX/fd/1powinno to być miękkie łącze do dowolnego urządzenia wwyświetlanego przez polecenie. Jaka jest na tym wydajność ls -l?
RealSkeptic

Informacje TTY można również znaleźć na wyjściu z tty(tylko prąd) lub who(wszystkie).
Nick Volynkin

14

Możesz użyć writepolecenia.

Jak skomentował @MelBurslan, jeśli uprawnienie do zapisu jest wyłączone, najpierw wykonaj:

 $ mesg y

Z man mesg

OPCJE

y Zezwól na dostęp do zapisu w twoim terminalu.

Zastosowanie zapisu:

$ write username tty

np. wyślij lswyjście do innego terminala.

$ 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

na arch. linuksie, w terminalu gnome, wyjściem wpolecenia jest edward tty2 19:53 6:05 2:48 23.12s firefoxi jeśli napiszęls | write edward tty2 nie otrzymam żadnego wyjścia, tylko dźwięk
Edward Torvalds

@edwardtorvalds Udało ci się napisać edwardd zamiast edward?
tachomi

także jeśli spróbuję na tty5 (ctrl + alt + 5) otrzymuję błądyou have turned write permission off
Edward Torvalds

błąd pisania na tej stronie
Edward Torvalds

wypróbuj mesg ykomendę na docelowym terminalu, zanim uruchomisz komendę
MelBurslan,

7

Znalazłem podobną metodę.

Na pierwszym terminalu :

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

Na drugim terminalu :

$ ls > /dev/pts/0

Teraz masz wyjście na pierwszym terminalu


1
tail -fzamiast catmoże być przydatny
tachomi

3
@ tachomi tak naprawdę nie ma potrzeby żadnego polecenia do odczytania wyniku
Edward Torvalds

4

Użyj tty polecenia w każdym terminalu, aby je zidentyfikować:

$ tty
/dev/pts/0

$ tty
/dev/pts/1

Zakładając te TTY, aby przekierować stdout pierwszego na drugi, uruchom to w pierwszym terminalu:

exec 1>/dev/pts/1

Uwaga: teraz każde wyjście komendy będzie wyświetlane na pts / 1

Aby przywrócić domyślne zachowanie standardowego punktu pts / 0:

exec 1>/dev/pts/0

Obejrzyj ten film, aby zobaczyć demonstrację.


ta odpowiedź również jest dobra
Edward Torvalds

0

możesz napisać do TTY terminala; na przykład:

w terminalu 1:

$ tty 
ttys000

w terminalu 2:

$ tty
ttys029

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

Dane wyjściowe będą wyświetlane w obu terminalach w czasie rzeczywistym, nawet podczas pisania.

Działa na systemie Linux i macOS. Ścieżka macOS TTY jest /dev/{number}w Linuksie/dev/pts/{number}


wykonanie exec &> >(tee >(cat >&/dev/ttys000))nie istnieje, co uniemożliwia pisanie.
Edward Torvalds,

@EdwardTorvalds na Linuxie ttybędzie coś w stylu/dev/pts/0
Miguel Mota

tak, tego właśnie użyłem do przetestowania twojego kodu
Edward Torvalds

@EdwardTorvalds jakie polecenie nie istnieje?
Miguel Mota,

twoje polecenie exec &> >(tee >(cat >&/dev/pts/1)). Brak kombinacji klawiszy sterujących (ctrl + c). Muszę zabić terminal, aby wyjść
Edward Torvalds

-3

Możesz użyć wallrównież:

$ wall "Message here"

możesz to szczegółowo opisać. Nic z tego nie rozumiem
Edward Torvalds

3
Na pewno nie chcesz używać wall(skrót od „write all”), ponieważ zapisuje się on do każdej zalogowanej sesji tty, w tym do tej, z której wysyłasz. Zamiast tego użycie writepozwala zadeklarować określony tty.
Monty Harder
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.