Я пишу сценарий оболочки, и я хотел бы написать команды в сценарии, но перенаправить вывод на другие сеансы консоли. (используя kde)
5 ответов
Сначала ищите номер, который идентифицирует текущий сеанс tty; давайте рассмотрим число как X
:
| terminal 1 | terminal 2 |
------------------------------------------------------
| $ tty | $ |
| /dev/pts/X | |
Затем используйте данное число для записи в выбранный tty:
| terminal 1 | terminal 2 |
------------------------------------------------------
| $ tty | $ echo "foo" > /dev/pts/X |
| /dev/pts/X | |
И это даст:
| terminal 1 | terminal 2 |
------------------------------------------------------
| $ tty | $ echo "foo" > /dev/pts/X |
| /dev/pts/X | |
| foo | |
Вы можете направить вывод в файл журнала, за которым следуют другие сеансы.
В любом другом терминале:
touch foo && tail -f foo
В "главном" терминале:
script.sh > foo
Используйте команду tty
в каждом терминале, чтобы идентифицировать их:
$ tty
/dev/pts/0
$ tty
/dev/pts/1
Предполагая, что эти TTY, чтобы перенаправить стандартный вывод первого на второй, запустите это в первом терминале:
exec 1>/dev/pts/1
Примечание: теперь каждый вывод команды будет отображаться в pts/1
Чтобы восстановить стандартное поведение pts/0:
exec 1>/dev/pts/0
Смотрите это видео для демонстрации.
Вывести вывод терминала в файл, а не в терминал, в котором вы сейчас находитесь:
commands >>outputfile
В новом терминале используйте tail, чтобы показать содержимое выходного файла и автоматически обновлять его по мере добавления текста:
tail -f outputfile
Поздно, но, может быть, лучше, чем никогда ... :-)
mkfifo ~/MyOutput # Create the FIFO (Special file)
./MyScript.sh > ~/MyOutput # In the terminal/console 1
cat ~/MyOutput # In another tty/console
из info coreutils 'mkfifo invocation'
:
"FIFO" - это специальный тип файла, который позволяет независимым процессам взаимодействовать. Один процесс открывает файл FIFO для записи, а другой - для чтения, после чего данные могут передаваться как с обычным анонимным каналом в оболочках или в другом месте.
Примечания стороны:
- Лучше создавать FIFO не в вашем домашнем каталоге :-)
- Вы можете иметь более одного
FIFO
для одного и того же процесса (std out, std err). - Пока вы не будете запрашивать дамп у
FIFOs
он будет содержать весь вывод.
Как вы спросите в первый раз, это вымывает все. - Вы можете перенаправить (или добавить) в другой файл
cat MyOutput >> NewRealFile
- Вы также можете использовать
cat MyOutput
с другого терминала! - Предупреждение : если вы попросите две разные программы (или экземпляры) перенаправить вывод в один и тот же
FIFOs
поток будет объединен (априори нет способа отличить, из каких программ поступает эта строка). - Предупреждение : если вы спросите 2 или более раз (возможно, с разных терминалов), это даст одну строку для каждого запроса, разделяющего вывод для запрашивающей стороны.
- У него может быть более сложное применение: как правильно запустить программу и сделать возможным перенаправить ее работающий вывод (stdout и stderr) на более позднем этапе?