4

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

5 ответов5

4

Сначала ищите номер, который идентифицирует текущий сеанс 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                      |                           |
3

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

В любом другом терминале:

touch foo && tail -f foo

В "главном" терминале:

script.sh > foo
0

Используйте команду 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

Вывести вывод терминала в файл, а не в терминал, в котором вы сейчас находитесь:

commands >>outputfile

В новом терминале используйте tail, чтобы показать содержимое выходного файла и автоматически обновлять его по мере добавления текста:

tail -f outputfile
0

Поздно, но, может быть, лучше, чем никогда ... :-)

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) на более позднем этапе?

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .