Як відправити вихід з одного терміналу на інший, не створюючи жодної нової труби чи файлу


26

Я просто обманюю свій термінал (термінал Gnome). Мені було цікаво, чи є спосіб відправити вихід одного терміналу в інший без необхідності робити новий файл або трубу.

наприклад: на першому терміналі я запускаю lsі хочу, щоб його вихід відображався на другому терміналі (з використанням або без використання жодної команди на другому)


що ти маєш? Ви щось пробували? Чи можете ви навести кілька прикладів?
tachomi

@tachomi на першому терміналі я запускаю lsі хочу, щоб його вихід відображався на другому терміналі (з використанням або без використання жодної команди на другому)
Едвард Торвальдс

Відповіді:


30

Якщо обидва термінали належать одному і тому ж користувачеві, ви можете надіслати свій вихід на віртуальний пристрій, який використовується в якості конкретного терміналу.

Таким чином, ви можете використовувати вихід з w, який включає інформацію про TTY, і записувати безпосередньо на цей пристрій.

ls > /dev/pts/7

(Якщо пристрій, про який згадував, wбув pts / 7)

Інший варіант - використовувати номер процесу, підключеного до цього пристрою. Надішліть свій вихід на адресу /proc/<process number>/fd/1.

ls > /proc/5555/fd/1

Якщо припустити, що ви знайшли номер процесу, який працює в цьому терміналі, 5555.

Зауважте, що це пряме записування дозволено лише в тому випадку, якщо користувач, який намагається записати, є тим самим користувачем, який володіє іншим терміналом .


Я не отримую /dev/pts/7або схоже з wкомандою, але другий спосіб працює для мене
Едвард Торвальдс

2
@edwardtorvalds /proc/XXX/fd/1Зазвичай це м'яке посилання на базовий пристрій. Спробуйте скористатися ls -l /proc/XXXX/fd/1і побачити, на що він вказує. Чи має воно якесь відношення до того, що з’явилося в wкоманді?
RealSkeptic

Я не пов'язую wкоманду з /proc/XXX/fd/0я стосуюся wкоманди з/dev/pts/7
Едвардом Торвальдсом

4
@edwardtorvalds Я кажу, що вони підключені так, як /proc/XXX/fd/1це повинно бути м'яким посиланням на будь-який пристрій, який wвідображає команда. Який результат ls -lна ньому?
RealSkeptic

Інформацію TTY також можна знайти у висновку з tty(тільки поточний) або who(всі).
Нік Волинкін

14

Ви можете використовувати writeкоманду.

Як прокоментував @MelBurslan, якщо дозвіл на запис вимкнено, спочатку виконайте:

 $ mesg y

З man mesg

ВАРІАНТИ

y Дозволити запису доступу до вашого терміналу.

Використання запису:

$ write username tty

наприклад, надіслати lsвихід на інший термінал.

$ 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

на арці Linux, в терміналі gnome, wкоманда виводиться , edward tty2 19:53 6:05 2:48 23.12s firefoxі якщо я пишу, ls | write edward tty2я не отримую жодного звуку, окрім звукового сигналу
Едвард Торвальдс

@edwardtorvalds Ви звільнили вас, edwarddа не ввели текст edward?
tachomi

також якщо я спробую це на tty5 (ctrl + alt + 5), я отримую помилкуyou have turned write permission off
Едвард Торвальдс

що набрав помилку на цьому веб-сайті
Едвард Торвальдс

спробуйте mesg yкоманду на цільовому терміналі, перш ніж запустити команду
MelBurslan

7

Я знайшов подібний метод.

На першому терміналі :

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

На другому терміналі :

$ ls > /dev/pts/0

Тепер ви отримуєте вихід на першому терміналі


1
tail -fзамість catможе бути корисним
tachomi

3
@tachomi насправді не потрібно жодної команди, щоб прочитати вихід
Едвард Торвальдс

4

Використовуйте ttyкоманду в кожному терміналі, щоб ідентифікувати їх:

$ tty
/dev/pts/0

$ tty
/dev/pts/1

Припускаючи ці TTY, щоб перенаправити stdout першого на другий, запустіть це у першому терміналі:

exec 1>/dev/pts/1

Примітка: Тепер кожен вихід команди відображатиметься на pts / 1

Щоб відновити типову поведінку за замовчуванням pts / 0:

exec 1>/dev/pts/0

Дивіться це відео для демонстрації.


ця відповідь також хороша
Едвард Торвальдс

0

ви можете написати в TTY терміналу; наприклад:

у терміналі 1:

$ tty 
ttys000

у терміналі 2:

$ tty
ttys029

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

Вихід відображатиметься в обох терміналах у режимі реального часу навіть під час введення.

Працює на Linux та macOS. Шлях до macOS TTY знаходиться /dev/{number}в Linux/dev/pts/{number}


виконання exec &> >(tee >(cat >&/dev/ttys000))не існує, що робить неможливим набір.
Едвард Торвальдс

@EdwardTorvalds на Linux ttyбуде щось подібне/dev/pts/0
Мігель Мота

так, саме це я використовував для перевірки вашого коду
Едвард Торвальдс

@EdwardTorvalds яка команда не існує?
Мігель Мота

ваша команда exec &> >(tee >(cat >&/dev/pts/1)). Не працює комбінація клавіш керування (ctrl + c). Я маю вбити термінал для виходу
Едвард Торвальдс

-3

Ви також можете використовувати wall:

$ wall "Message here"

ви можете описати це докладно. Я нічого з цього не розумію
Едвард Торвальдс

3
Ви точно не хочете користуватися wall(скорочено "написати все"), як це пише для кожного входу, в який ви ввійшли в систему, включаючи ту, з якої ви надсилаєте. Натомість використання writeдозволяє оголосити конкретну tty.
Monty Harder
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.