Я пытаюсь создать демонстрационную виртуальную машину. На рабочем столе у меня есть скрипт foo.sh
, и он выводит стандартный вывод в foo.log
(например, с some command > foo.log
)
. Когда я дважды щелкаю по скрипту, он генерирует файл foo.log. Тем не менее, я хотел бы, чтобы скрипт также представлял стандартный вывод в реальном времени (например, используя tail -f foo.log
).
Как я могу это сделать? Нужно ли направлять вывод в два места?
Это может быть не самый элегантный подход, но, похоже, он работает:
Добавьте следующее в скрипт:
touch foo.log
uxterm -e "tail -f foo.log" &
some command > foo.log
с gnome-Terminal, замените uxterm -e
на gnome-terminal -x
.
Спасибо Hilltop Yodeler за указание на это решение.
Стандартная команда tee
Unix позволяет перенаправить стандартный ввод команды в один или несколько файлов, а также распечатать ее на стандартный вывод. Таким образом, вы можете сделать что-то вроде
myscript.sh|tee mylog.log
при условии, что myscript.sh просто печатает на стандартный вывод (что на самом деле упростит его)
Чтобы открыть окно терминала при нажатии на значок, можно обернуть его в другой скрипт:
xterm -e "myscript.sh | tee mylog.log; read -p FINISHED"
Разница с вашим решением в том, что у вас есть выбор: закрыть окно терминала после завершения скрипта или показать сообщение «Нажмите любую клавишу для продолжения ...» - с помощью tail -f
терминал практически не может узнать, когда завершился ваш скрипт, поэтому вам нужно прервать его с помощью Ctrl-C.
Кроме того, tail -f должен быть менее эффективным, чем печать непосредственно на терминал, но это, вероятно, не очень важно в наши дни.
Я сделал предложение Сергея, и если оно сработало, это может быть проблемой пути. Вот точная команда, которую я использовал, и результатом было открытие xterm, показывающее вывод скрипта и затем сообщение «Нажмите return для закрытия». Я предлагаю вам добавить путь перед именем сценария и, возможно, именем файла журнала.
xterm -e "./myscript.sh | tee ./mylog.log; read -p Press\ return\ to\ close\ "
Вся моя версия myscript.sh
состояла в том, чтобы повторить несколько строк, но это сработало.