
Я пишу скрипт bash и хочу, чтобы последняя команда запускалась как отдельный процесс. Последняя команда также отправляет весь вывод в файл. Однако я также хочу, чтобы вывод все равно отображался на консоли. Пока что у меня есть следующее:
$ command > "file" &
Это отправляет вывод в "файл" и также запускает команду как свой собственный процесс. Однако я также хочу одновременно просматривать вывод в консоли (но если я нажму ctrl+c или w/e, команда не остановится). Это очень похоже наэтот вопрос, но с учетом того, что это должна быть его собственная нить.
Я пытался:
$ command | tee "file" &
но проблема в том, что тройник — это часть процесса, и выходной результат фактически не появляется.
Итак, просто для ясности, я хочу иметь command
свой собственный процесс, отправляющий вывод в файл, но при этом выводящийся в консоли (пока я не нажму q, enter, ctrl+c или что-то еще). Поскольку это скрипт bash, две отдельные строки были бы приемлемы.
решение1
Похоже, вы хотите command
закончить запись в файл, но хотите иметь возможность прервать вывод на консоль. Я бы выбрал другой подход к решению. В вашем скрипте:
> "file"
command > "file" &
tail -n +1 -F "file"
Исправление:
В исходном ответе использовался -n 0
, который изначально не выводит ни одной строки, "file"
но выводит любые строки, добавленные "file"
после того, как tail
был запущен. Это не было моим намерением — это была ошибка. Я намеревался использовать опцию, которая вывела бы все строки, "file"
даже если бы command
написала некоторые до того, как tail
был запущен. Правильная опция для такого поведения — -n +1
.
Из tail(1)
страницы руководства:
-n, --lines=K вывести последние K строк вместо последних 10; или используйте -n +K для вывода строк, начинающихся с K-го
Первая строка очищает содержимое файла в случае возникновения состояния гонки, когда tail
файл попадает в предыдущий раз command
.