Остановка после первой строки вывода
Я пытаюсь сделать следующее в скрипте Bash: запустить команду (например, tail -f log_file
), дождитесь прибытия определенного вывода, затем остановите команду и продолжите работу со сценарием.
Я попробовал следующее, но это не сработало:
tail -f log_file | grep some_text | head -n1
У меня нет выхода таким образом.
Теперь я попытался диагностировать проблему. Когда я просто бегу tail -n1
, затем введите что-то в терминал, оно выходит после первой строки. Однако, если я запускаю следующее:
grep some_text | head -n1
В этом случае я не получаю вывод, пока я не нажму CTRL+D, а затем он напечатает первую строку ввода, содержащую some_text
,
Мой вопрос, почему это? Если head
выводит первую строку сразу в первом случае, почему не получается, когда он получает входные данные из канала? Разве он не должен выводить все для первых n строк, а затем выходить, посылая сигнал SIGPIPE на другой конец канала?
2 ответа
grep
буферизует ваш ввод Пытаться grep --line-buffered
,
Есть дополнительная проблема, head
завершится только после получения второй строки, которая может быть проблемой, если ваш файл журнала низкочастотный. См. Как прочитать одну строку из tail -f
через конвейер, а потом прекратить?,
Когда ты бежишь tail -n1
без ввода, он выйдет после первой строки ввода из STDIN, вот как это должно работать. Когда ты бежишь grep some_text | head -n1
вы опять не предоставляете никакой информации grep
Таким образом, может показаться, что поведение, которое вы описываете, является нормальным. Когда вы нажимаете CTRL D, вы закрываете канал STDIN, и head -n1
выводит то, что `grep получил от STDIN.