![Команда для одновременной печати вывода на консоль и в файл в разных потоках](https://rvso.com/image/1400518/%D0%9A%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D0%B0%20%D0%B4%D0%BB%D1%8F%20%D0%BE%D0%B4%D0%BD%D0%BE%D0%B2%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9%20%D0%BF%D0%B5%D1%87%D0%B0%D1%82%D0%B8%20%D0%B2%D1%8B%D0%B2%D0%BE%D0%B4%D0%B0%20%D0%BD%D0%B0%20%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%20%D0%B8%20%D0%B2%20%D1%84%D0%B0%D0%B9%D0%BB%20%D0%B2%20%D1%80%D0%B0%D0%B7%D0%BD%D1%8B%D1%85%20%D0%BF%D0%BE%D1%82%D0%BE%D0%BA%D0%B0%D1%85.png)
Я пишу скрипт 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
.