Как отключить перемещение одной вкладки терминала с помощью прерывания EOF (ctr -d )на терминале xfce?

cat <

Проблема с переводом этого на то, что использует tail, заключается в том, что tailнужно прочитать весь файл, чтобы найти его конец. Чтобы использовать это в своем конвейере, вам нужно

  1. Предоставьте полное содержание документа tail.
  2. Предоставьте его еще раз по cat.
  3. Именно в таком порядке.

Хитрость заключается не в том, чтобы дублировать содержимое документа(teeделает это ), а в том, чтобы вывод tailпроисходил до вывода остальной части документа без использования промежуточного временного файла.

Использованиеsed(или awk, как это делает John1024,)избавляет от двойного разбора данных и проблемы упорядочения путем сохранения данных в памяти.

Решение, которое я предлагаю sedсостоит в том, чтобы

  1. 1{h;d;}, сохранить первую строку в ячейке удержания, как -, и перейти к следующей строке.
  2. H, добавляйте каждую другую строку в пространство для хранения со встроенным символом новой строки.
  3. ${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 -

имеет ту же проблему.

1
01.06.2020, 21:16
0 ответов

Теги

Похожие вопросы