Это работает для вас?
tail -n +0 -F /tmp/foo | sed '/EOF/q'
Я предполагаю, что EOF - это шаблон, который вы ищете.Команда sed
завершает работу при обнаружении, что означает, что tail
должен завершиться при следующей записи.
Я полагаю, что есть внешний шанс, что tail
будет зависать, если шаблоннаходится примерно в конце файла, ожидая, пока в файле появятся дополнительные выходные данные, которые никогда не появятся.Если это действительно проблема, вы, возможно, могли бы организовать ее уничтожение - конвейер в целом завершится, когда sed
завершится (если вы не используете забавную оболочку, которая решает, что это не правильное поведение).
ворчание по поводу Bash
Как и опасалось, bash
(по крайней мере, в MacOS X, но, вероятно, везде) - это оболочка, которая думает, что ей нужно зависнуть в ожидании завершения операции tail
хотя sed
ушел.Иногда - чаще, чем мне нравится - я предпочитаю поведение старой доброй оболочки Bourne, которая была не такой умной и потому реже угадывалась, чем Bash.dribbler
- это программа, которая выводит сообщения по одной в секунду (в примере «1: Hello» и т. Д.), И вывод выводится на стандартный вывод.В Bash эта последовательность команд зависает до тех пор, пока я не выполнил 'echo pqr >>/tmp/foo
' в отдельном окне.
date
{ timeout -t 2m dribbler -t -m Hello; echo EOF; } >/tmp/foo &
echo Hi
sleep 1 # Ensure /tmp/foo is created
tail -n +0 -F /tmp/foo | sed '/EOF/q'
date
К сожалению, я не сразу вижу возможность контролировать это поведение.Я нашел shopt lithist
, но это не связано с этой проблемой.
Ура для Korn Shell
Я отмечаю, что когда я запускаю этот скрипт с использованием оболочки Korn, он работает так, как я ожидал -оставляя tail
скрывающимся вокруг, чтобы быть убитым как-то.То, что работает, это 'echo pqr >> /tmp/foo
' после завершения второй команды date.