Надо перенаправить поток вывода какой-нибудь команды процессу в другом терминале, например cat. В свою очередь, он должен перенаправить свой вывод в следующий терминал.
Пути решения нашел, например, здесь
Пробую. Запускаю процесс:
~$ tty
/dev/pty1
~$ cat > /dev/pty2
Посылаю сообщение:
~$ tty
/dev/pty0
~$ echo "Hi from $(tty)" > /dev/pty1
Но моё сообщение я вижу в первом терминале, а не во втором как ожидал:
~$ tty
/dev/pty1
~$ cat > /dev/pty2
Hi from /dev/pty0
~$ tty
/dev/pty2
~$
Почему второе перенаправление не работает?
Ответ
У меня так:
Первый терминал /dev/pts/0,
второй - /dev/pts/1
На втором запускаю cat:
# cat < /dev/pts/0
На первом:
# echo “hi” > /dev/pts/1
В результате hi появляется во втором терминале.
А в приведенной вами ссылке лучше работать через proc и дескрипторы, так как задача передать вывод процессу, а не просто в терминал.
Update
Все, что написано выше решает только задачу "отобразить вывод в другом терминале" и не решает "перенаправить поток вывода процессу в другом терминале".
Соответственно, и никакие дальнейшие передачи (по другим терминалам) не получатся.
Как быть?
Мне кажется проще всего это делать через named-pipe (mkfifo) (через несколько каналов, например).
Но если хочется через стандартные редиректы-каналы, то есть вариант написать немного трэша.
Для примера пишем скрипт echo.sh
#!/bin/bash
while read std
do
echo "$std +"
done
и запускаем его в одном из терминалов (например, в /dev/pts/4) следующим образом:
$ cat - | ./echo.sh
В другом терминале (пусть будет /dev/pts/0) ищем pid процесса echo.sh, пусть он равен 23441.
И в этом же терминале делаем так:
$ echo "Hi again" > /proc/23441/fd/0
Смотрим результат в терминале /dev/pts/4:
Hi again +
и это означает, что скрипт принял таки вывод с другого терминала и добавил к сообщению "+".
По этой схеме можно передавать в следующий терминал.
Возможно есть и более элегантное решение.
Update 2. Три терминала
Сделаем тоже самое с тремя терминалами pts/0, pts/1, pts/2.
Сначала делаем копию echo.sh с именем echo2.sh.
echo2.sh запускаем в pts/2:
$ cat - | ./echo2.sh
затем идем в pts/1 и находим pid процесса echo2.sh, пусть будет 31677. Теперь в pts/1 запускаем команду:
$ cat - | ./echo.sh | tee >/proc/31677/fd/0 >(cat)
в этой конструкции я использовал tee только ради наглядности примера, чтобы отобразить будущий вывод в данном терминале. Если задачи отображения нет, то и tee не надо.
И наконец идем в первый терминал pts/0. В нем ищем pid процесса echo.sh, пусть будет 31715, и запускаем команду:
$ echo "Hello world" > /proc/31715/fd/0
Проверяем результат в остальных терминалах.
Во втором будет Hello world +, в третьем - Hello world + +
Комментариев нет:
Отправить комментарий