cat <Проблема с переводом этого на то, что использует tail
, заключается в том, что tail
нужно прочитать весь файл, чтобы найти его конец. Чтобы использовать это в своем конвейере, вам нужно
- Предоставьте полное содержание документа
tail
. - Предоставьте его еще раз по
cat
. - Именно в таком порядке.
Хитрость заключается не в том, чтобы дублировать содержимое документа(tee
делает это ), а в том, чтобы вывод tail
происходил до вывода остальной части документа без использования промежуточного временного файла.
Использованиеsed
(или awk
, как это делает John1024,)избавляет от двойного разбора данных и проблемы упорядочения путем сохранения данных в памяти.
Решение, которое я предлагаю sed
состоит в том, чтобы
1{h;d;}
, сохранить первую строку в ячейке удержания, как -, и перейти к следующей строке. H
, добавляйте каждую другую строку в пространство для хранения со встроенным символом новой строки. ${G;p;}
, добавьте пробел к последней строке со встроенной новой строкой и распечатайте полученные данные.
Это дословный перевод решения John1024 на sed
с той оговоркой, что стандарт POSIX гарантирует только то, что пространство хранения составляет не менее 8192 байт (8 КиБ; но он рекомендует , чтобы этот буфер динамически выделялся и расширялся по мере необходимости, что и GNU sed
и BSD sed
делают ).
Если вы позволите себе использовать именованный канал:
mkfifo mypipe
cat <
Используется tee
для отправки данных вниз mypipe
и одновременно на cat
. Утилита cat
сначала прочитает вывод из tail
(, который считывается из mypipe
, который tee
записывает в ), а затем добавляет копию документа, поступающего непосредственно из tee
.
Однако в этом есть серьезная ошибка: если документ слишком велик,(превышает размер буфера канала ), запись tee
в mypipe
и cat
будет block, ожидая, пока (безымянный )канал опустеет. Он не будет опустошен, пока cat
не прочитает из него. cat
не будет читать из него, пока tail
не закончит. И tail
не закончится, пока tee
не закончится. Это классическая тупиковая ситуация.
Вариация
tee >( tail -n 1 >mypipe ) | cat mypipe -
имеет ту же проблему.