Как отправить вывод с одного терминала на другой без создания какого-либо нового канала или файла

26

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

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

Эдвард Торвальдс
источник
что у тебя есть? Вы что-нибудь пробовали? Можете привести несколько примеров?
tachomi
@tachomi на первом терминале, который я запускаю lsи хочу, чтобы его вывод отображался на втором терминале (с использованием или без использования какой-либо команды на втором)
Эдвард Торвальдс

Ответы:

30

Если оба терминала принадлежат одному и тому же пользователю, вы можете отправить свой вывод на виртуальное устройство, которое используется как tty конкретного терминала.

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

ls > /dev/pts/7

(Если упомянутое устройство wбыло pts / 7)

Другой вариант - использовать номер процесса, подключенного к этому устройству. Отправьте свой вывод на /proc/<process number>/fd/1.

ls > /proc/5555/fd/1

Предполагая, что номер процесса, который вы нашли и который работает в этом терминале, равен 5555.

Обратите внимание, что прямая запись разрешена только в том случае, если пользователь, пытающийся выполнить запись, является тем же пользователем, которому принадлежит другой терминал .

RealSkeptic
источник
Я не понимаю /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
tachomi
источник
на Arch Linux, в гнома терминале, вывод 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, чтобы перенаправить стандартный вывод первого на второй, запустите это в первом терминале:

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 all»), так как он записывает в каждый сеанс tty, вошедший в систему, включая тот, с которого вы отправляете. Вместо этого использование writeпозволяет объявить определенный tty.
Монти Хардер